백기선님의 강의 영상을 보고 Mvc 통합테스트를 하는 방법을 익혔다. 하지만 현업에서 그렇게 했을 때 생기는 문제점을 피드백 받았고, 컨트롤러를 테스트 하는 두 가지 방법이 있음을 알게 되었다.
예제 코드
아래의 예제를 보자.
[TestController]
@RestController
@RequiredArgsConstructor
public class TestController {
private TestService testService;
@GetMapping("/hello")
public String hello() {
return "Controller : " + testService.hello();
}
}
[TestService]
@Service
public class TestService {
public String hello() {
return "hello";
}
}
이제 GET /hello
로 요청을 보내면 "Controller : hello" 라는 문자열을 반환한다.
@SpringBootTest + @AutoConfigureMovcMvc
@AutoConfigureMockMvc
@SpringBootTest
@ActiveProfiles("test")
public class TestControllerTest {
@Autowired
private MockMvc mockMvc;
public void hello() throws Exception {
mockMvc.perform(get("/mailboxes"))
.andExpect(status().isOk())
.andExpect(content().string("\"Controller : hello\""));
}
}
특징
- 프로젝트 내부에 있는 스프링 빈을 모두 등록한다. (테스트가 느리다)
- 실제 운영 환경에서 사용되는 클래스들을 통합해서 테스트한다.
- 실제 환경과 가장 유사하게 테스트가 가능하다.
- Service 메서드의 스펙이 변경되어도 Mocking 값을 수정하지 않아도 된다. (변경에 자유롭다)
- 테스트 단위가 커서 디버깅이 까다롭다.
@WebMvcTest + MockBean
@WebMvcTest(TestController.class)
public class TestControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private TestService testService;
public void hello() throws Exception {
given(testService.hello()).willReturn("hello"));
mockMvc.perform(get("/mailboxes"))
.andExpect(status().isOk())
.andExpect(content().string("\"Controller : hello\""));
}
}
특징
- 컨트롤러의 역할만을 테스트한다.
- Web Layer에 해당하는 빈만 빠르게 생성한다.
- Security, Filter, Interceptor, Request/Response Handling, Controller 등
- @Component를 등록하지 않으므로 필요한 빈을 직접 채워줘야 한다.
- 테스트가 훨씬 빠르다.
- 통합테스트에서 진행이 어려운 경우를 Mock으로 테스트할 수 있다.
- Mock 객체를 사용하므로 실제 동작과 차이가 있다.
- Mocking 메서드의 변경이 일어나면 수정해줘야 한다.
Reference
'Server > Spring' 카테고리의 다른 글
Spring - JpaRepository와 Querydsl 연결하기! (사용자 정의 리포지토리) (2) | 2022.06.18 |
---|---|
SpringBoot - 프로퍼티를 안전하게 가져오는 방법! (0) | 2022.06.14 |
QueryDSL - Repository 구조잡기 (extends / implements 사용 X) (0) | 2022.05.29 |
Spring - Multi DataSource 환경에서 Transaction, QueryDSL 사용하는 방법 (0) | 2022.05.21 |
Spring - 필터(Filter)와 인터셉터(Interceptor)의 차이 (0) | 2022.04.27 |