brunch

You can make anything
by writing

C.S.Lewis

by 에디의 기술블로그 Jan 17. 2021

[임시 글..나중에 지울 예정]
단위 테스트 예습

스터디 중에.. 테스트 코드 작성이 너무 어렵다는 분들이 계셔서, 단위 테스트에 대해서 간략하게 먼저 소개합니다. 이 글은, 제가 이전에 작성했던 아래 글의 내용의 일부를 인용하였습니다.  

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 를 사용한 것입니다. 

테스트를 실행해보면.. 잘 성공합니다.



https://github.com/sieunkr/spring-study-group/blob/master/2-4/src/test/java/com/example/demo/service/MovieServiceTest.java



MovieService 가 아니라 MovieGroup 을 단위테스트 해도 됩니다. 우리는 MovieGroup 이라는 일급컬랙션을 사용하였기 때문에, 의존성 없이 테스트할 수 있습니다. 


https://github.com/sieunkr/spring-study-group/blob/master/2-4/src/test/java/com/example/demo/core/MovieGroupTest.java


자세한 설명은 4주차에 다시 하겠습니다. 참고하시고, 대략 이런식으로 하시면 됩니다.....

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari