객체를 쉽게 만들고 관리하고 검증할 수 있는 기능을 제공하는 자바 테스트 프레임워크.
Jetbrain에서 조사결과 테스트코드를 작성하는 자바 개발자의 46%가 Mockito를 사용하는 것으로 나왔다.
https://www.jetbrains.com/lp/devecosystem-2022/java
1) Mockito 를 이용해서 직접 생성
CategoryService categoryService = Mockito.mock(CategoryService.class);
2) 어노테이션을 이용해서 생성
@Mock
private CategoryService categoryService;
@Test
void test1(@Mock CategoryService categoryService) {
System.out.println(1);
}
1) 리턴값 지정
아래와 같이 Mockito의 when을 이용해서 Mock 객체의 메소드를 지정한 후 thenReturn을 이용해서 리턴될 값을 지정할 수 있다.
Mockito.when(categoryService.findCategories())
.thenReturn(Collections.emptyList());
또한 아래와 같이 사용할 수도 있다. 아래의 코드는 1L 이라는 파라미터가 넘어갈 경우의 리턴값을 지정하는 코드이다.
Mockito.when(categoryService.findById(1L))
.thenReturn(new Category(1L, "테스트 카테고리"));
그런데 실제로 사용할때는 파라미터의 값이 명확하지 않는 경우가 더 많다. 이런경우는 아래와 같이 any를 이용할 수 있다. 아래에서는 1L 대신에 anyLong()을 넘겼다. anyLong 은 Long값이면 어느것이나 다 된다는 의미이다.
Mockito.when(categoryService.findById(Mockito.anyLong()))
.thenReturn(new Category(1L, "테스트 카테고리"));
anyLong 이외에도 any, anyString, anyInt, anyList 등 다양한 any를 이용할 수 있다.
2) 예외 발생
아래와 같이 doThrow를 이용해서 호출될 경우 예외를 던지도록 하는것도 가능하다.
Mockito.doThrow(new NullPointerException())
.when(categoryService).findCategories();
1) 호출횟수 확인
아래와 같이 verify를 이용해서 호출이 되었는지 확인할 수 있다. 아래는 1번 호출이 되었는지 검증하는 코드이다.
Mockito.verify(categoryService.findCategories());
아래와 같이 times 를 이용해서 몇번이나 되었는지에 대한 테스트도 가능하다. 아래는 3번 호출이 되었는지 검증하는 코드이다.
Mockito.verify(categoryService.findCategories(), Mockito.times(3));
2) 호출 순서 확인
아래와 같이 inOrder를 이용해서 호출 순서를 검증할 수 있다. 아래의 코드에서는 update 호출 이후에 delete를 호출 했는지를 검증하는 코드이다.
InOrder inOrder = Mockito.inOrder(categoryService);
inOrder.verify(categoryService).update(Mockito.anyLong(), Mockito.any());
inOrder.verify(categoryService).delete(Mockito.anyLong());
@Spy
Mock은 가짜 객체를 생성하지만 경우에 따라서는 실제 객체에서 일부만 Stubbing 하거나 확인할 필요가 있다. 이때 사용하는것이 @Spy이다. 사용방법은 @Mock과 동일하지만 Stubbing을 하지 않으면 Real Method를 호출한다는 차이가 있다.