ocultar how hashtags java mockito

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 una Answer 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:

  1. Estás usando Mock, no Spy
  2. 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:

  1. 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);

  1. 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));