Mockito 사용법

지능바바·2023년 6월 4일
0

JUnit

목록 보기
2/2

1. Mockito란?

객체를 쉽게 만들고 관리하고 검증할 수 있는 기능을 제공하는 자바 테스트 프레임워크.
Jetbrain에서 조사결과 테스트코드를 작성하는 자바 개발자의 46%가 Mockito를 사용하는 것으로 나왔다.
https://www.jetbrains.com/lp/devecosystem-2022/java


2. Mock 객체 생성방법

1) Mockito 를 이용해서 직접 생성

CategoryService categoryService = Mockito.mock(CategoryService.class);

2) 어노테이션을 이용해서 생성

@Mock
private CategoryService categoryService;

위의 두가지 방법중 어느것을 사용해도 무방하지만 보통 @Mock 어노테이션으로 생성하는 방식을 많이 사용한다.
@Mock 어노테이션을 이용해서 Mock 객체를 생성할 경우 아래와 같이 테스트 메소도에서 주입받는것도 가능하다.
@Test
void test1(@Mock CategoryService categoryService) {
    System.out.println(1);
}

3. Mock 객체의 Stubbing

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

4. Mock 객체의 확인

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

5. 기타

@Spy
Mock은 가짜 객체를 생성하지만 경우에 따라서는 실제 객체에서 일부만 Stubbing 하거나 확인할 필요가 있다. 이때 사용하는것이 @Spy이다. 사용방법은 @Mock과 동일하지만 Stubbing을 하지 않으면 Real Method를 호출한다는 차이가 있다.

0개의 댓글