TIL 2023/12/01 Spring 단위테스트 자세히
테스트 코드 작성 공통 준수 사항
- 보통 테스트를 위한 라이브러리로 JUnit과 AssertJ 조합을 사용하여 테스트를 한다.
- Given/When/Then 패턴
- Given : 어떠한 데이터가 주어질 때.
- When : 어떠한 기능을 실행하면.
- Then : 어떠한 결과를 기대한다.
Mockito를 사용한 단위 테스트
- 모키토는, 개발자가 동작을 직접적으로 제어할 수 있는 가짜 객체를 지원하는 테스트 프레임웍이다.
- Spring 어플리케이션은 여러 객체들 간의 의존성이 생기는데 이러한 의존성을 모키토를 이용하여 단절 시킴으로 단위 테스트를 쉽게 작성하는 것을 도와준다.
- 앞으로 작성할 예제 테스트 에서는 모키토와 JUnit5의 조합으로 테스트 코드를 작성할 것 이다.
컨트롤러 계층 단위 테스트
- 컨트롤러의 단위 테스트를 하기 위해서 Mockito를 이용하여 다른 계층과 의존관계를 단절 시켜 주어야한다.
- 컨트롤러가 의존하고 있는 객체는 MemberService와 MemberMapper 객체다.
- 컨트롤러를 테스트 하기 위해서는 HTTP 호출이 필요하다. 스프링 부트는 컨트롤러 테스트를 위한 @WebMvcTest 어노테이션을 제공한다.
- 이를 이용하면 MockMvc 객체가 자동으로 생성될 뿐만 아니라 테스트에 필요한 요소들을 빈으로 등록해 스프링 컨텍스트 환경을 구성 해 준다.
서비스 계층 단위 테스트
- 예제 서비스 코드에서 MemberService는 MemberRepository에 의존 하고 있다.
- 서비스 계층은 HTTP 호출과 상관 없으며 단순한 로직 검증만 하면 된다.
- Repository에 저장하는 로직은 단순하기 때문에 입력된 회원 정보가 중복 될시 예외가 발생하는 경우를 테스트 하였다.
레포지토리 계층 단위 테스트
- @DataJpaTest 어노테이션은, 스프링 부트에서 JPA 레포지토리를 쉽게 테스트 할수 있게 지원 한다.
- 해당 프로젝트에서는 H2 인메모리 DB를 구축해 놓았고, @DataJpaTest 어노테이션은 기본적으로 H2를 기반으로 테스트하며, 테스트가 끝나면 트랜잭션 롤백을 한다.
- 실제 DB와 통신을 하지 않으면 테스트의 의미가 없으므로, 목킹은 하지 않는다.