Mockito : doAnswer vs then Return
추후 유닛 테스트에는 Mockito를 사용하고 있습니다.언제 사용해야 할지 혼란스럽다doAnswer
대thenReturn
.
누가 좀 자세히 도와줄 수 있어요?지금까지 제가 해봤는데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
다음과 같은 경우 동일한 작업을 수행합니다.
- Spy가 아닌 Mock을 사용하고 있습니다.
- 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가지 사용 사례를 생각할 수 있습니다.
- 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);
- 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
'programing' 카테고리의 다른 글
어떻게 조건부로의 반응 요소들에 특성을 추가하니? (0) | 2022.09.19 |
---|---|
ubuntu 서버에서 pip install mariadb 오류 발생 (0) | 2022.09.19 |
MySQL의 기존 필드에 문자열을 추가하려면 어떻게 해야 합니까? (0) | 2022.09.19 |
데이터 테이블에서 기본 슬롯 isOpen 수정 Vuetify 2.0 (0) | 2022.09.19 |
파일 크기(바이트)를 사람이 읽을 수 있는 문자열로 변환 (0) | 2022.09.14 |