728x90
항해 31일차 2022.02.09
MVC 테스트
Spring MVC Test
- Spring MVC 컨트롤러의 테스트를 말한다.
- 컨트롤러의 자체는 단위 테스트가 필요할 만한 비즈니스 로직이 존재하지 않기 때문에 통합 테스트의 관점으로 접근해야 한다.
- E2E로 테스트를 할 경우
- 뷰가 생성한 응답 데이터(HTML)의 유효성을 검증할 수 있으나,
- 에플리케이션이나 데이터베이스가 반드시 기동되어야 하는 등의 단점이 있다.
- Spring Test는 E2E의 단점을 해소하면서 통합한 상태의 컨트롤러 테스트를 위해 ‘MockMvc’를 제공하고 있다.
MockMvc
- Spring에서는 MockMvc를 제공해 웹 애플리케이션을 서버에 배포하지 않고 스프링 MVC의 동작을 재현할 수 있다.
- 테스트 케이스의 메서드는 DispathcherServlet에 요청할 데이터(요청경로나 요청파라미터)를 설정하고, MockMvc는 DispathcherServlet에 요청을 보낸다.
- DispathcherServlet은 요청을 받아 매핑정보를 보고 그에 맞는 컨트롤러 메서드를 호출한다.
- 테스트 케이스 메서드는 MockMvc가 반환하는 실행결과를 받아 실행 결과가 맞는지 검증한다.
테스트 코드에 @WebMvcTest를 추가해 사용할 수 있다.
예제
@WebMvcTest(
controllers = {UserController.class, ProductController.class},
excludeFilters = {
@ComponentScan.Filter(
type = FilterType.ASSIGNABLE_TYPE,
classes = WebSecurityConfig.class
)
}
)
class UserProductMvcTest {
private MockMvc mvc;
private Principal mockPrincipal;
@Autowired
private WebApplicationContext context;
@Autowired
private ObjectMapper objectMapper;
@MockBean
UserService userService;
...
@Test
@DisplayName("회원 가입 요청 처리")
void test2() throws Exception {
// given
MultiValueMap<String, String> signupRequestForm = new LinkedMultiValueMap<>();
signupRequestForm.add("username", "제이홉");
signupRequestForm.add("password", "hope!@#");
signupRequestForm.add("email", "hope@sparta.com");
signupRequestForm.add("admin", "false");
// when - then
mvc.perform(post("/user/signup")
.params(signupRequestForm)
)
.andExpect(status().is3xxRedirection())
.andExpect(view().name("redirect:/user/login"))
.andDo(print());
}
'Spring' 카테고리의 다른 글
JWT 방식의 정보 인증 (0) | 2024.04.12 |
---|---|
[TIL] CORS에러! 무엇인가? (1) | 2024.04.12 |
RESTful하다? (0) | 2024.04.12 |
싱글톤 패턴 (0) | 2024.04.12 |
[TIL] 객체지향 설계 5원칙(SOLID) (0) | 2024.04.12 |