2016-04-14 4 views
40

Я использую Mockito для последующего модульного тестирования. Я смущен, когда следует использовать doAnswer против thenReturn.Mockito: doAnswer Vs thenReturn

Может ли кто-нибудь помочь мне в деталях? До сих пор я пробовал это с thenReturn.

ответ

62

Вы должны использовать thenReturn или doReturn, когда знаете значение возврата во время вымывания вызова метода. Это определенное значение возвращается при вызове метода mocked.

thenReturn(T value) Устанавливает возвращаемое значение, возвращаемое при вызове метода.

@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 используется, когда вам нужно сделать дополнительные действия, когда издевались метод вызывается, например, когда вам нужно вычислить возвращаемое значение на основе параметров этого вызова метода.

Используйте doAnswer(), когда вы хотите, чтобы окурок метод недействительным с родовым Answer.

Отвечает задание, которое выполняется, и возвращаемое значение, которое возвращается при взаимодействии с макетом.

@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"); 
} 
+0

Благодаря @schlauergerd. Теперь я понял. –

+0

привет @Roland Weisleder, но иногда вам нужно возвращать внутренний код, генерируемый значением, и ничего общего с аргументами, например. 'code = UUID.randomUUID()', мне не удалось реализовать это с помощью 'mockito'. – zhuguowei

+0

Когда ваш макет должен вернуть новый UUID для каждого вызова, вы должны реализовать 'Ответ' только с' return UUID.randomUUID(); '. –

Смежные вопросы