다음과 같이 반환타입이 void인 간단한 메서드가 있다고 가정하겠습니다.
@Transactional
public void deletePost(Long id) {
postRepository.deleteById(id);
}
반환타입이 void인 메서드는 Mockito에서 when(), given()을 이용해서 테스트할 수 없습니다.
when() 또는 given() 대신 doAnswer() 와 doThrow() 를 사용할 수 있습니다.
doAnswer()를 사용하는 경우 Answer 인터페이스를 인수로 받습니다. 찾아본 예제들은 대부분 화면에 값을 출력하는데 사용하여, 아래에서는 바로 null을 반환했습니다.
@Test
void requestDeletePostAndReturn204WithNothing() throws Exception {
var targetPostId = 1L;
doAnswer(invocation -> null)
.when(postService).deletePost(anyLong());
mockMvc.perform(delete("/api/v1/posts/" + targetPostId))
.andExpect(status().isNoContent());
}
아래는 공식문서 예제입니다.
doAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
Mock mock = invocation.getMock();
return null;
}})
.when(mock).someMethod();
doThrow()는 Throwable을 인수로 받습니다. 필요에 따라 추가하면 됩니다.
@Test
void requestDeletePostAndReturn404() throws Exception {
var targetPostId = 999L;
doThrow(new PostNotFoundException(targetPostId))
.when(postService).deletePost(anyLong());
mockMvc.perform(delete("/api/v1/posts/" + targetPostId))
.andExpect(status().isNotFound())
.andExpect(content().string(containsString(new PostNotFoundException(targetPostId).getMessage())));
}
아래는 공식문서 예제입니다.
doThrow(new RuntimeException()).when(mock).someVoidMethod();
doThrow(RuntimeException.class).when(mock).someVoidMethod();
doThrow(RuntimeException.class, BigFailure.class).when(mock).someVoidMethod();
이외에도 doNothing(), doCallRealMethod() 등이 있습니다.