스터디 중에.. 테스트 코드 작성이 너무 어렵다는 분들이 계셔서, 단위 테스트에 대해서 간략하게 먼저 소개합니다. 이 글은, 제가 이전에 작성했던 아래 글의 내용의 일부를 인용하였습니다.
https://brunch.co.kr/@springboot/418
우리는 MovieService 에 영화 평점 순으로 정렬하는 기능을 구현할 것입니다. 테스트 코드를 작성하기 전에 MovieService 클래스를 먼저 볼게요. 스프링의 @Service 어노테이션이 선언되어있습니다. MovieService 는 스프링부트가 실행될 때 ComponentScan에 의해서 Bean 으로 등록이 될 것입니다.
MovieService 는 Bean(빈)으로 등록이 되는 과정에서, MovieRepository 를 의존성 주입 받습니다. 즉, MovieService 객체를 생성하기 위해서는 반드시 생성자에 MovieRepository가 주입되어야 합니다. 하지만, 생각처럼 쉽지는 않습니다. 이유는, 주입되는 MovieRepository 역시 Bean 으로 등록이 되는 컴포넌트이며, NaverProperties 와 RestTemplate 를 의존성 주입 받기 때문입니다.
이해가 잘 안되시는 분을 위해서, 아주 허접한 그림을 그려봤습니다.
평점 순 정렬 기능이 구현되는 MovieService 클래스를 만들기 위해서는, MovieRepository 를 만들어서 넣어줘야 하며, 추가로 NaverProperties 와 RestTemplate 까지 만들어서 넣어줘야 합니다. MovieService의 기능을 테스트하기 위해서 너무 많은 객체를 주입해줘야 합니다.
이런 경우에는 Mock 객체를 사용해야 합니다.
그림의 오른 쪽 핑크색 영역이 전부 Mocking 이 될 것입니다.
테스트 코드에 MovieRepository 를 상속받는 MockMovieRepository라는 이름의 내장 클래스를 정의합니다. 그리고 MockMovieRepository 클래스로 만든 가짜객체를 MovieService 에 주입합니다.
아래와 같이 Mock 클래스를 만들어줍니다.
그리고, 테스트 코드에서 Mock 클래스를 주입해주면 됩니다.
테스트를 실행하면 성공했다는 메시지를 확인할 수 있습니다.
display 가 제대로 표시되지 않는다면, 인텔리 J 에서 아래 설정을 해주세요.
하지만, 위에 작성한 코드는 Mock 클래스를 직접 생성해야 하기 때문에 코드가 조금 지저분합니다. Mockito 라는 라이브러리를 사용해보겠습니다.
Mockito 를 편하게 사용하기 위해서, 어노테이션을 추가합니다.
그리고, 아래와 같이 Mock 객체를 정의합니다.
테스트 코드에서는..
참고로, BBDMockito 를 사용한 것입니다.
테스트를 실행해보면.. 잘 성공합니다.
MovieService 가 아니라 MovieGroup 을 단위테스트 해도 됩니다. 우리는 MovieGroup 이라는 일급컬랙션을 사용하였기 때문에, 의존성 없이 테스트할 수 있습니다.
자세한 설명은 4주차에 다시 하겠습니다. 참고하시고, 대략 이런식으로 하시면 됩니다.....