valor son salida referencia reciben que por paso parámetros parametros parametro objeto metodos los ejemplos ejemplo como argumentos java mockito

son - paso de parametros en java ejemplo



¿Cómo puedo hacer que un método devuelva un argumento que se le pasó? (7)

Considere una firma de método como:

public String myFunction(String abc);

¿Puede Mockito ayudar a devolver la misma cadena que recibió el método?


Con Java 8 es posible crear una respuesta de una línea incluso con una versión anterior de Mockito:

when(myMock.myFunction(anyString()).then(i -> i.getArgumentAt(0, String.class));

Por supuesto, esto no es tan útil como usar las Respuestas AdditionalAnswers sugeridas por David Wallace, pero puede ser útil si desea transformar el argumento "sobre la marcha".


Con Java 8, la respuesta de Steve puede convertirse

public void testMyFunction() throws Exception { Application mock = mock(Application.class); when(mock.myFunction(anyString())).thenAnswer( invocation -> { Object[] args = invocation.getArguments(); return args[0]; }); assertEquals("someString", mock.myFunction("someString")); assertEquals("anotherString", mock.myFunction("anotherString")); }

EDITAR: Aún más corto:

public void testMyFunction() throws Exception { Application mock = mock(Application.class); when(mock.myFunction(anyString())).thenAnswer( invocation -> invocation.getArgument(0)); assertEquals("someString", mock.myFunction("someString")); assertEquals("anotherString", mock.myFunction("anotherString")); }


Es posible que desee utilizar Verify () en combinación con ArgumentCaptor para asegurar la ejecución en la prueba y ArgumentCaptor para evaluar los argumentos:

ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class); verify(mock).myFunction(argument.capture()); assertEquals("the expected value here", argument.getValue());

El valor del argumento es obviamente accesible a través del argumento.getValue () para una mayor manipulación / verificación / lo que sea.


Puedes crear una Respuesta en Mockito. Supongamos que tenemos una interfaz llamada Aplicación con un método myFunction.

public interface Application { public String myFunction(String abc); }

Aquí está el método de prueba con una respuesta Mockito:

public void testMyFunction() throws Exception { Application mock = mock(Application.class); when(mock.myFunction(anyString())).thenAnswer(new Answer<String>() { @Override public String answer(InvocationOnMock invocation) throws Throwable { Object[] args = invocation.getArguments(); return (String) args[0]; } }); assertEquals("someString",mock.myFunction("someString")); assertEquals("anotherString",mock.myFunction("anotherString")); }

Desde Mockito 1.9.5 y Java 8, hay una forma aún más fácil utilizando las funciones lambda:

when(myMock.myFunction(anyString())).thenAnswer(i -> i.getArguments()[0]);


Si tiene Mockito 1.9.5 o superior, existe un nuevo método estático que puede hacer que el objeto de Answer para usted. Necesitas escribir algo como

when(myMock.myFunction(anyString())).then(returnsFirstArg());

o alternativamente

doAnswer(returnsFirstArg()).when(myMock).myFunction(anyString());

Tenga en cuenta que el método returnsFirstArg() es estático en la clase AdditionalAnswers , que es nuevo en Mockito 1.9.5; así que necesitarás la importación estática correcta.


Tuve un problema muy similar. El objetivo era burlarse de un servicio que persiste a los objetos y puede devolverlos por su nombre. El servicio se ve así:

public class RoomService { public Room findByName(String roomName) {...} public void persist(Room room) {...} }

El simulacro de servicio utiliza un mapa para almacenar las instancias de la sala.

RoomService roomService = mock(RoomService.class); final Map<String, Room> roomMap = new HashMap<String, Room>(); // mock for method persist doAnswer(new Answer<Void>() { @Override public Void answer(InvocationOnMock invocation) throws Throwable { Object[] arguments = invocation.getArguments(); if (arguments != null && arguments.length > 0 && arguments[0] != null) { Room room = (Room) arguments[0]; roomMap.put(room.getName(), room); } return null; } }).when(roomService).persist(any(Room.class)); // mock for method findByName when(roomService.findByName(anyString())).thenAnswer(new Answer<Room>() { @Override public Room answer(InvocationOnMock invocation) throws Throwable { Object[] arguments = invocation.getArguments(); if (arguments != null && arguments.length > 0 && arguments[0] != null) { String key = (String) arguments[0]; if (roomMap.containsKey(key)) { return roomMap.get(key); } } return null; } });

Ahora podemos ejecutar nuestras pruebas en este simulacro. Por ejemplo:

String name = "room"; Room room = new Room(name); roomService.persist(room); assertThat(roomService.findByName(name), equalTo(room)); assertNull(roomService.findByName("none"));


Yo uso algo similar (básicamente es el mismo enfoque). A veces es útil que un objeto simulado devuelva una salida predefinida para ciertas entradas. Eso va así:

private Hashtable<InputObject, OutputObject> table = new Hashtable<InputObject, OutputObject>(); table.put(input1, ouput1); table.put(input2, ouput2); ... when(mockObject.method(any(InputObject.class))).thenAnswer( new Answer<OutputObject>() { @Override public OutputObject answer(final InvocationOnMock invocation) throws Throwable { InputObject input = (InputObject) invocation.getArguments()[0]; if (table.containsKey(input)) { return table.get(input); } else { return null; // alternatively, you could throw an exception } } } );