java - ocultar - instagram how to hide hashtags
Mockito: doAnswer Vs thenReturn (2)
Debe usar
thenReturn
o
doReturn
cuando sepa el valor de retorno en el momento en que se burla de una llamada al método.
Este valor definido se devuelve cuando invoca el método simulado.
thenReturn(T value)
Establece un valor de retorno que se devolverá cuando se llame al método.
@Test
public void test_return() throws Exception {
Dummy dummy = mock(Dummy.class);
int returnValue = 5;
// choose your preferred way
when(dummy.stringLength("dummy")).thenReturn(returnValue);
doReturn(returnValue).when(dummy).stringLength("dummy");
}
Answer
se utiliza cuando necesita realizar acciones adicionales cuando se invoca un método simulado, por ejemplo, cuando necesita calcular el valor de retorno en función de los parámetros de esta llamada al método.
Use
doAnswer()
cuando desee aplicar un método vacío con unaAnswer
genérica.La respuesta especifica una acción que se ejecuta y un valor de retorno que se devuelve cuando interactúa con el simulacro.
@Test
public void test_answer() throws Exception {
Dummy dummy = mock(Dummy.class);
Answer<Integer> answer = new Answer<Integer>() {
public Integer answer(InvocationOnMock invocation) throws Throwable {
String string = invocation.getArgumentAt(0, String.class);
return string.length() * 2;
}
};
// choose your preferred way
when(dummy.stringLength("dummy")).thenAnswer(answer);
doAnswer(answer).when(dummy).stringLength("dummy");
}
Estoy usando Mockito para el servicio de pruebas unitarias posteriores.
Estoy confundido sobre cuándo usar
doAnswer
vs
thenReturn
.
¿Alguien puede ayudarme en detalle?
Hasta ahora, lo he intentado con
thenReturn
.
doAnswer
y
thenReturn
hacen lo mismo si:
- Estás usando Mock, no Spy
- El método que está copiando está devolviendo un valor, no un método nulo.
Vamos a burlarnos de este BookService
public interface BookService {
String getAuthor();
void queryBookTitle(BookServiceCallback callback);
}
Puede tropezar getAuthor () usando
doAnswer
y
thenReturn
.
BookService service = mock(BookService.class);
when(service.getAuthor()).thenReturn("Joshua");
// or..
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
return "Joshua";
}
}).when(service).getAuthor();
Tenga en cuenta que cuando usa
doAnswer
, no puede pasar un método sobre
when
.
// Will throw UnfinishedStubbingException
doAnswer(invocation -> "Joshua").when(service.getAuthor());
Entonces, ¿cuándo
doAnswer
lugar de
thenReturn
?
Se me ocurren dos casos de uso:
- Cuando desee "anular" el método vacío.
Con doAnswer puede realizar algunas acciones adicionales al invocar el método. Por ejemplo, desencadenar una devolución de llamada en queryBookTitle.
BookServiceCallback callback = new BookServiceCallback() {
@Override
public void onSuccess(String bookTitle) {
assertEquals("Effective Java", bookTitle);
}
};
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
BookServiceCallback callback = (BookServiceCallback) invocation.getArguments()[0];
callback.onSuccess("Effective Java");
// return null because queryBookTitle is void
return null;
}
}).when(service).queryBookTitle(callback);
service.queryBookTitle(callback);
- Cuando estás usando Spy en lugar de Mock
Cuando use when-thenReturn en Spy Mockito llamará al método real y luego tropezará con su respuesta. Esto puede causar un problema si no desea llamar al método real, como en este ejemplo:
List list = new LinkedList();
List spy = spy(list);
// Will throw java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
when(spy.get(0)).thenReturn("java");
assertEquals("java", spy.get(0));
Usando doAnswer podemos tropezarlo de manera segura.
List list = new LinkedList();
List spy = spy(list);
doAnswer(invocation -> "java").when(spy).get(0);
assertEquals("java", spy.get(0));
En realidad, si no desea realizar acciones adicionales tras la invocación del método, puede usar
doReturn
.
List list = new LinkedList();
List spy = spy(list);
doReturn("java").when(spy).get(0);
assertEquals("java", spy.get(0));