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 지원등의 다양한 기능들이 있다. 차근차근 기본적인 것부터 추가하며 여러 기능을 사용해봐야 겠다. 하지만 무엇보다 중요한건 테스트는 최대한 엄격하고 세세하지만 간단하게 작성해야겠다.
댓글남기기