Mockito를 이용한 테스트

나는 주로 스프링이 제공하는 테스트 컨텍스트 프레임워크 JUnit 확장 기능을 이용하여 테스트 코드를 작성한다.

service 로직 -> DAO 로직 -> myBatis query 또는 

DAO 로직 -> myBatis query 와 같이 두 가지 케이스의 테스트 코드를 많이 작성하게 되는데 이번에 service layer에 해당하는 클래스만 테스트 코드를 작성하는 방법에 대해서 알아보게 되었고, 토비의 스프링 3.1 스터디 기간에 학습했던 mockito를 사용해 보기로 했다.

Mock 객체를 쉽게 제공하고 사용할 수 있는 여러 프레임워크가 있는데 그 중 mockito가 인기가 좋다고 한다. 사실 다른 Mock 프레임워크를 사용해 보지 못해 잘 알지는 못하지만 다른 분들의 경험적 지식과 구글 트렌드 조사를 확인해 보니 확실히 mockito가 좋은 것 같기는 하다.



mockito에서 제공하는 기능 중 verify, when..then 기능에 대해서 아래와 같이 테스트 케이스를 작성해 보았다. verify기능은 쉽게 이해가 되었지만 when..then 기능은 눈으로 봤을 때 잘 이해가 되지 않았다. 여러번 테스트 코드를 작성해 본 후에야 이해를 할 수 있었다. 

역시 눈으로 보는 것보다는 직접 코드를 작성하는 것이 더 쉽게 이해가 되는 것 같다. 이런 경험을 통해 내가 깨닫는 것은 운동을 눈으로 하는 것과 몸으로 하는 것의 차이 만큼 몸으로 체화하는 이해와 습득이야 말로 가장 좋은 학습법이라고 생각한다.



자. 이제는 mockito를 실무에서 어떻게 활용 할 수 있을지에 대해서 알아보자. 내가 테스트 하고자 하는 클래스는 UserService 이며 getUser, getUserCnt 메소드를 테스트 할 것이다. 헌데 한 가지 문제가 있다. UserService 클래스에는 아래와 같이 UserDAO를 스프링의 애노테이션을 이용하여 객체 주입을 받고 있다. 이렇게 클래스를 설계하게 되면 setter 메소드가 없고, 또한 private 접근 제한자로 되어 있기 때문에 객체를 주입할 수 있는 방법이 없다. 하지만 Mockito에서는 이를 위해 애노테이션을 이용한 객체 주입 기능을 제공한다.

@Autowired

private UserDAO userDAO;


테스트 하고자 하는 클래스 위에 @RunWith(MockitoJUnitRunner.class)를 선언한 후 UserService 클래스에 주입해야 하는 UserDAO 클래스 위에 @Mock 애노테이션을 추가하면 UserDAO 타입의 Mock 객체가 생성된다.

이 Mock 객체를 UserService 클래스에 주입할 때에는 @InjectMocks 애노테이션을 추가해 주면 된다.

mockito에서 내부적으로 객체 주입 시 타입을 확인한 후 주입을 하는 것 같다.



이처럼 다양한 테스트 주도 개발 방법론은 내가 개발한 서비스의 품질을 높일 수 있고, 버그로 부터 어느 정도 자유로울 수 있다. 그러니 테스트 코드의 작성을 습관화 하자.

mockito 한글 메뉴얼