프로젝트/뉴스피드

[단위 테스트/Mockito] 게시글 서비스 레이어 단위 테스트 - 1 (with ReflectionTestUtils)

writtenbyrla 2024. 2. 26. 11:06

 

MockMvc를 이용하여 컨트롤러 통합테스트를 끝냈다.

 

[통합 테스트/MockMvc] 어쩌다 회원 가입만 290번

처음 해보는 통합테스트. 개발용 DB의 영향을 최소화하고자 테스트용 DB를 따로 만들어 연결하고 테스트를 진행하였다. 문제 상황 1. [ DB 연결 문제] 개발용 DB를 MySQL로 사용하고 있기 때문에 혹시

writtenbyrla.tistory.com

 

 

테스트를 위한 별도 DB를 생성하여 모든 예외사항에 대해 전체 테스트를 끝냈는데, 아무리 생각해도 비즈니스 로직은 서비스단에 포함되어 있으면서 테스트 하는동안 db에 영향을 많이 받는다는 생각이 들었다.

 

컨트롤러에서 통합 테스트를 하는 것이 필요없는 것은 아니지만 이미 개발을 진행하면서 postman으로 테스트해본 내용과 거의 일치하기 때문에 더 작은 단위로 나누어 외부 영향을 받지 않으면서 독립적으로 비즈니스 로직만 테스트하는 단계가 반드시 필요하다는 생각이 들었다.

 

테스트를 하다보니 테스트 단계는 개발 과정과 동시에 진행되거나 이전에 진행되어야 할 필요가 있다고 느꼈으며, 다음 프로젝트에서는 TDD 방식으로 테스트 주도 개발을 해볼 생각이다.

 

 

 


 

 

 

여차저차 지금이라도 늦지 않았으니 service 레이어에서 단위 테스트를 진행해보고자 Mockito를 이용하여 테스트 코드를 작성해보았는데 첫 테스트부터 막혔다.

 

문제 상황은 게시글 작성 로직을 테스트하면서 계속해서 사용자 정보를 찾지 못하는 것이었다.

나의 코드를 보면, 현재 로그인한 유저의 정보에서 userId를 받아 실제 서비스 이용자가 맞는지 확인한 이후에 작성을 할 수 있게 UserException을 던지고 있다.

 

Mockito를 이용한 단위테스트는 DB와 독립되어 테스트를 진행하는 것인데, PK에 대한 시퀀스 자동생성은 DB에서 제공하는 기능이므로 당연히 PK가 계속해서 null로 생성이 되어 userId로 확인할 수 없는 것이다.

 

 

문제의 테스트 코드

 

테스트 결과 등록된 사용자 정보 없음

 

게시글 등록 서비스 계층 비즈니스 로직

 

 

 


 

 

 

 

 

통합 테스트에서는 테스트용 db에 샘플 데이터를 3~5개정도 넣어놓고 했지만, 단위테스트에서는 완전하게 독립된 상황에서 테스트 할 수 있도록 ReflectionTestUtils를 적용하기로 했다.

 

ReflectionTestUtils란?

 

Spring Framework에서 제공하는 유틸리티 클래스로 테스트 코드에서 필요한 필드값을 설정할 수 있다. 따로 DB에 영향을 미치지 않으면서 테스트시에만 유효한 1회성 데이터라고 생각하면 된다. 이를 사용하면 DB에 영향을 주거나 받지 않고 독립적인 테스트가 가능하다.

 

아래와 같이 user 정보를 세팅하여 게시글 작성 테스트시에만 유효할 수 있도록 field를 지정해주고 테스트를 진행하였다.

 

수정된 코드

 

테스트 결과 성공!

 

 

 

 


 

단위 테스트에 관한 다음 기록

 

[단위 테스트/Mockito] 게시글 서비스레이어 단위 테스트 - 2 (with JUnit 버전 문제)

단위 테스트 이전 글 [단위 테스트/Mockito] 게시글 서비스 레이어 단위 테스트 - 1 (with ReflectionTestUtils) MockMvc를 이용하여 컨트롤러 통합테스트를 끝냈다. 테스트를 위한 별도 DB를 생성하여 모든 예

writtenbyrla.tistory.com