티스토리 뷰

Spring

[ junit5 ] 단위테스트 - controller

tbMaster 2021. 12. 30. 15:32
반응형

작성한 코드에 대한 테스트를 수행하고 싶어, 제대로 알지 못한 상태에서 @SpringBootTest 를 붙여 테스트를 진행하였다. 이것저것 영상이나, 블로그를 보면서 @SpringBootTest를 여기저기 붙이길래, 아~ @SpringBootTest를 붙이면 테스트 되고 이게 Spring에서 제공하는 단위테스트 구나~ 라고 막연하게 생각하며 사용했었다. 

 

그런데 TDD에 관심을 갖게되면서, @SpringBootTest는 주로 통합테스트에 사용하는 것으로, 이유는 모든 Spring이 관리하는 모든 Bean을 등록하여 테스트를 진행하기 때문임을 알게 되었다. 즉, 작은 단위에 기능테스트만 진행하기에는 모든 Bean을 등록하는 @SpringBootTest는 비용이 크다는 것이다. 그래서 해당 기능만을 테스트 하기 위해, 필요한 그 외의 기능들은 Mock 을 이용해서 대체 구현하는 것이었다.

 

 

 

이번 글은 통합테스트가 아닌 단위테스트를  Controller 단에서 수행하며, 직면한 문제에 대한 해결법을 작성하였다.


 

문제점

NullPointExcpetion Error 발생

: 에러 내용 확인 확인 결과 MockMvc 객체가 Null임을 알 수 있었다.  MockMvc에 대한 @Autowired를 넣고, 테스트 클래스에 @AutoConfigureMockMvc 를 넣어,  자동적으로 MockMvc에 대한 설정을 하도록 했는데..... 왜?? 

[ 하단 Debugger에 mockMvc = null ]

 

 

착각

MockMvc 를 사용하기 위해서는 무조건 @AutoConfigureMockMvc 를 사용해야 하는 줄 알았다. 그런데 찾아보니... 

 

  아니다!

@AutoConfigureMockMvc 는 @SpringBootTest와 같이 사용하며, @SpringBootTest가 MockMvc 객체를 생성하지 못하기 때문에 @AutoConfigureMockMvc를 이용하여 MockMvc 객체를 사용할 수 있도록 해준다는 것이다.

 

 

 해결방법

1. @SpringBootTest  + @AutoConfigreMockMvc

[ 하단 Debugger에 mockMvc 객체 생성됨 ]

2. @WebMvcTest 추가

[ 하단 Debugger에 mockMvc 객체 생성됨 ]

 

 

 

@WebMvcTest

@MockBean과 함께 사용하여 필요한 종속 객체에 대한 대체 구현을 가능하도록 제공하며, 여러 계층을 통합하는 @SpringBootTest 와 달리 단일 Controller만 실행하도록 제한한다. 또한, HTTP 서버를 시작하지 않고도 MVC 컨드롤러를 쉽게 테스트하는 기능을 제공하는 MockMvc를 자동으로 구성한다.

@SpringBootTest

 애플리케이션의 여러 계층을 통합하는데 중점을 두는 통합테스트이다. 따라서 mocking을 포함하지 않는다. 단위테스트와는 분리되어 통합테스트를 수행한다. 이유는 통합테스트의 경우 실제 데이터베이스 등이 수행될 수 있으며, 테스트에 대한 시간이 오래 걸리기 때문이다.

@AutoConfigureMockMvc

MockMvc 의 자동 설정 및 활성화 하기 위해, test class 에 적용하는 어노테이션

 

 

레퍼런스

https://www.baeldung.com/spring-boot-testing

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함