TDD(Test Driven Development) JUnit 5 - Mockito (5)

아래 내용은 ‘테스트 주도 개발: TDD 실천법과 도구’(https://repo.yona.io/doortts/blog/issue/1)를 보고 주요 내용을 개인적으로 정리하여 작성했습니다.

Mockito ?


특징 및 동기 에서 보면 JMock, EasyMock 보다 가볍고 직관적인 라이브러리라고 설명하고 있다. 또한 기존의 예상-실행-검증 이 아닌 방식으로 행위 보다 상태에 조금더 집중했다고 되어있다.

문법은 EasyMock 과 비슷하며 따라서 EasyMock 에서의 리팩토링에 큰 어려움이 없다. 테스트 스파이 또한 구현되어 있다. 아래 몇가지 추가적인 특징이 있다.

  • 인터페이스 만큼 견고한 Mock 객체
  • 간단한 어노테이션 지원 ex) @Mock
  • 검증 에러에 대한 깔끔한 출력 지원
  • 유연한 검증 가능 ex) 원하는 것만 검증하거나, 특정 검증을 제외 시키는 것
  • 횟수 및 최소 한번 실행에 대한 검증 제공
  • 인수를 이용한 stub 과 유연한 검증 제공 ex) 리플렉션을 사용한 anyObject(), anyString(), refEq() 등
  • 사용자 정의 Matcher 함수 또는 기존의 Hamcrest Matcher 사용 가능

Mockito 설치


Maven

<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-all</artifactId>
  <version>1.10.19</version>
  <scope>test</scope>
</dependency>

Gradle

testCompile group: 'org.mockito', name: 'mockito-all', version: '1.10.19'


Mockito 예제


Mockito 는 위에서 말했듯이 예상-실행-검증의 간단한 절차를 가진다. 그러면 이런 과정을 어떻게 작성해야 할까?

첫번째로 Mock 객체를 생성한다.

List mockedList = mock(List.class);

그 다음으로는 stub 을 정의한다. 대부분 when-then 으로 이루어져있다.

when(mockedList.get(0)).thenReturn("item");

마지막으로 실행에 대한 검증을 한다. 검증에는 호출횟수를 나타내는 함수(times(), atLeastOnce(), 등) 가 있다 또한 두번쨰 줄의 검증처럼 add 함수에 인자로 Matcher 함수를 넘겨줄 수 있다.

verify(mockedList, times(1)).add("item");

verify(mockedList).add(any())

그외에도 Mock 객체의 호출 순서를 지정하는 방법, void 메소드의 검증방법 등이 참고했던 페이지에 나와있다.


Mockito 예제 - spy


실제 객체를 Mock 객체로 사용할 수 있게 도와주는 기능이다. final 메소드는 spy 함수로 만들 수 없다.

마치며


Mockito 는 위에 나온 기능 외에도 BDD 지원, SMART_NULL 지원등의 다양한 기능들이 있다. 차근차근 기본적인 것부터 추가하며 여러 기능을 사용해봐야 겠다. 하지만 무엇보다 중요한건 테스트는 최대한 엄격하고 세세하지만 간단하게 작성해야겠다.

댓글남기기