티스토리 뷰
작성한 코드에 대한 테스트를 수행하고 싶어, 제대로 알지 못한 상태에서 @SpringBootTest 를 붙여 테스트를 진행하였다. 이것저것 영상이나, 블로그를 보면서 @SpringBootTest를 여기저기 붙이길래, 아~ @SpringBootTest를 붙이면 테스트 되고 이게 Spring에서 제공하는 단위테스트 구나~ 라고 막연하게 생각하며 사용했었다.
그런데 TDD에 관심을 갖게되면서, @SpringBootTest는 주로 통합테스트에 사용하는 것으로, 이유는 모든 Spring이 관리하는 모든 Bean을 등록하여 테스트를 진행하기 때문임을 알게 되었다. 즉, 작은 단위에 기능테스트만 진행하기에는 모든 Bean을 등록하는 @SpringBootTest는 비용이 크다는 것이다. 그래서 해당 기능만을 테스트 하기 위해, 필요한 그 외의 기능들은 Mock 을 이용해서 대체 구현하는 것이었다.
이번 글은 통합테스트가 아닌 단위테스트를 Controller 단에서 수행하며, 직면한 문제에 대한 해결법을 작성하였다.
문제점
NullPointExcpetion Error 발생
: 에러 내용 확인 확인 결과 MockMvc 객체가 Null임을 알 수 있었다. MockMvc에 대한 @Autowired를 넣고, 테스트 클래스에 @AutoConfigureMockMvc 를 넣어, 자동적으로 MockMvc에 대한 설정을 하도록 했는데..... 왜??
착각
MockMvc 를 사용하기 위해서는 무조건 @AutoConfigureMockMvc 를 사용해야 하는 줄 알았다. 그런데 찾아보니...
아니다!
@AutoConfigureMockMvc 는 @SpringBootTest와 같이 사용하며, @SpringBootTest가 MockMvc 객체를 생성하지 못하기 때문에 @AutoConfigureMockMvc를 이용하여 MockMvc 객체를 사용할 수 있도록 해준다는 것이다.
해결방법
1. @SpringBootTest + @AutoConfigreMockMvc
2. @WebMvcTest 추가
@WebMvcTest
@MockBean과 함께 사용하여 필요한 종속 객체에 대한 대체 구현을 가능하도록 제공하며, 여러 계층을 통합하는 @SpringBootTest 와 달리 단일 Controller만 실행하도록 제한한다. 또한, HTTP 서버를 시작하지 않고도 MVC 컨드롤러를 쉽게 테스트하는 기능을 제공하는 MockMvc를 자동으로 구성한다.
@SpringBootTest
애플리케이션의 여러 계층을 통합하는데 중점을 두는 통합테스트이다. 따라서 mocking을 포함하지 않는다. 단위테스트와는 분리되어 통합테스트를 수행한다. 이유는 통합테스트의 경우 실제 데이터베이스 등이 수행될 수 있으며, 테스트에 대한 시간이 오래 걸리기 때문이다.
@AutoConfigureMockMvc
MockMvc 의 자동 설정 및 활성화 하기 위해, test class 에 적용하는 어노테이션
레퍼런스
https://www.baeldung.com/spring-boot-testing
'Spring' 카테고리의 다른 글
[ 개념 ] DI ( Dependency Injection ) - 1 (0) | 2022.02.14 |
---|---|
[ validation ] BindException? MethodArgumentNotValidException? (+ @RequestBody) (0) | 2022.01.04 |
[Spring Rest Docs ] Spring Rest Docs 적용하기 (2) | 2021.11.23 |
[JPA] N:1 관계 (0) | 2021.11.22 |
[JPA] 1 :1 관계 (Foreign Key, Shared Primary Key) (0) | 2021.11.22 |