programing

Mockito : doAnswer vs then Return

prostudy 2022. 9. 19. 23:13
반응형

Mockito : doAnswer vs then Return

추후 유닛 테스트에는 Mockito를 사용하고 있습니다.언제 사용해야 할지 혼란스럽다doAnswerthenReturn.

누가 좀 자세히 도와줄 수 있어요?지금까지 제가 해봤는데thenReturn.

를 사용해 주세요.thenReturn또는doReturn메서드 호출을 모의했을 때 반환값을 알고 있는 경우.이 정의된 값은 조롱된 메서드를 호출할 때 반환됩니다.

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()generic을 사용하여 void 메서드를 stub할 경우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");
}

doAnswer그리고.thenReturn다음과 같은 경우 동일한 작업을 수행합니다.

  1. Spy가 아닌 Mock을 사용하고 있습니다.
  2. stubing 메서드는 값을 반환하는 것이지 void 메서드는 아닙니다.

이 Book Service를 조롱합시다.

public interface BookService {
    String getAuthor();
    void queryBookTitle(BookServiceCallback callback);
}

스텁을 얻을 수 있습니다.Author() 사용doAnswer그리고.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();

를 사용할 때 주의해 주세요.doAnswer, 메서드를 전달할 수 없습니다.when.

// Will throw UnfinishedStubbingException
doAnswer(invocation -> "Joshua").when(service.getAuthor());

그럼 언제 사용하시겠습니까?doAnswer대신thenReturn다음의 2가지 사용 사례를 생각할 수 있습니다.

  1. void 메서드를 "정지"하고 싶은 경우.

doAnswer를 사용하면 메서드 호출 시 몇 가지 추가 작업을 수행할 수 있습니다.예를 들어 queryBook에서 콜백을 트리거합니다.제목.

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. Mock 대신 Spy를 사용하는 경우

when을 사용하면 Return on Spy Mockito가 실제 메서드를 호출하고 답변을 스텁합니다.이는 다음 예시와 같이 실제 메서드를 호출하지 않을 경우 문제를 일으킬 수 있습니다.

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

doAnswer를 사용하면 안전하게 스텁할 수 있습니다.

List list = new LinkedList();
List spy = spy(list);
doAnswer(invocation -> "java").when(spy).get(0);
assertEquals("java", spy.get(0));

실제로 메서드 호출 시 추가 작업을 수행하지 않으려면doReturn.

List list = new LinkedList();
List spy = spy(list);
doReturn("java").when(spy).get(0);
assertEquals("java", spy.get(0));

가장 간단한 답은 다음과 같습니다.

  • 메서드 호출에서 고정 반환 값이 필요한 경우 반환(...)을 사용해야 합니다.
  • 작업을 수행해야 하거나 실행 시 값을 계산해야 할 경우 address(...)를 사용해야 합니다.

언급URL : https://stackoverflow.com/questions/36615330/mockito-doanswer-vs-thenreturn

반응형