@WebMvcTest | @SpringBootTest | |
---|---|---|
특징 | 컨트롤러의 역할만을 테스트 | 모든 스프링 빈을 등록 |
장점 | 1. 특정 클래스만 지정하여 보다 가볍고 빠른 테스트 가능 2. 통합테스트 진행하기 어려운 테스트를 개별적으로 진행 가능 | 애플리케이션의 설정, Bean을 모두 로드하기 때문에 운영환경과 가장 유사한 테스트 가능 |
단점 | Mock을 기반으로 테스트하기 때문에, 실제 환경에서 예상 밖의 동작오류 가능성 발생 | 경우 모든 빈을 로드하기 때문에 구동 시간이 오래 걸리고, 테스트 단위가 크기 때문에 디버깅이 어려울 수도 있음 |
@Test
마다 객체가 생성되어 각각의 @Test
가 붙은 객체끼리 영향을 주지 않는다.MockMvc 예시)
@WebMvcTest(PostController.class)
class PostControllerTest {
@MockBean
PostService postService;
@MockBean
BCryptPasswordEncoder encoder;
@Autowired
MockMvc mockMvc;
@Autowired
ObjectMapper objectMapper;
@Test
@DisplayName("등록 성공")
@WithMockUser // 권한 부여
void post_success() throws Exception {
PostRequest postRequest = PostRequest.builder()
.title("안녕")
.body("안녕하세요")
.build();
when(postService.create(any(),any())).thenReturn(PostResponse.builder().message("포스트 등록완료").postId(0L).build());
mockMvc.perform(post("/api/v1/posts")
.with(csrf())
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsBytes(postRequest)))
.andExpect(status().isOk())
.andExpect(jsonPath("$.result.message").exists())
.andExpect(jsonPath("$.result.postId").exists())
.andDo(print());
}
}