@SpringBootTest의 경우 모든 빈을 로드하기 때문에 테스트 구동 시간이 오래 걸리고, 테스트 단위가 크기 때문에 디버깅이 어려울 수 있다. Controller 레이어만 슬라이스 테스트 하고 싶을 때에는 @WebMvcTest를 쓰는게 유용하다.
웹에서 테스트하기 힘든 컨트롤러를 테스트 하는데 적합
@WebMvcTest는 @SpringBootTest와 같이 사용될 수 없다. 왜냐하면 각자 서로의 MockMvc를 모킹하기 때문에 충돌이 발생하기 때문이다.
JPA에 관련된 요소들만 테스트하기 위한 어노테이션으로 JPA 테스트에 관련된 설정들만 적용해준다.
메모리상에 내부 데이터베이스를 생성하고 @Entity가 선언된 클래스를 스캔하여 repository를 구성한다. @Transactional을 기본적으로 내장하고 있으므로, 각 테스트마다 테스트가 완료되면 관련한 설정들은 롤백된다. repository 테스트를 위해 사용
@ExtendWith(MockitoExtension.class)
class MemberServiceTest {
@Mock
private MemberRepository memberRepository;
@Mock
private Member member;
@Mock
private PasswordEncoder passwordEncoder;
@InjectMocks
private MemberService memberService;
private Member createMember(){
MemberFormDto memberFormDto = new MemberFormDto();
memberFormDto.setAddress("address");
memberFormDto.setEmail("aaa@aaa.com");
memberFormDto.setName("name");
memberFormDto.setPassword("1111");
return Member.createMember(memberFormDto, passwordEncoder);
}
테스트용 MVC환경을 만들어 요청 및 전송, 응답기능을 제공해주는 유틸리티 클래스다.MockMvcRequestBuilders
파일이 관련되어 있다면 MockMultipartHttpServletRequestBuilder
(1) aram / params : 쿼리 스트링 설정
(2) cookie : 쿠키 설정
(3) requestAttr : 요청 스코프 객체 설정
(4) sessionAttr : 세션 스코프 객체 설정
(5) content : 요청 본문 설정
(6) header / headers : 요청 헤더 설정
(7) contentType : 본문 타입 설정
(8)get, post : url 전송방식
public MockHttpServletRequestBuilder MockMvcRequestBuilder
(String url, MediaType mediaType, Map usernamePasswordMap)
throws JsonProcessingException {
return MockMvcRequestBuilders.post(url)
.contentType(mediaType)
.content(objectMapper.writeValueAsString(usernamePasswordMap));
}
public ResultActions perform2
(String url, MediaType mediaType, Map usernamePasswordMap)
throws Exception {
return mockMvc.perform(MockMvcRequestBuilder(
LOGIN_URL,
MediaType.APPLICATION_JSON,
usernamePasswordMap
));
}
(1)status : 상태 코드 검증
(2)header : 응답 header 검증
(3)content : 응답 본문 검증
(4)cookie : 쿠키 상태 검증
(5)view : 컨트롤러가 반환한 뷰 이름 검증
(6)redirectedUrl(Pattern) : 리다이렉트 대상의 경로 검증
(7)model : 스프링 MVC 모델 상태 검증
(8)request : 세션 스코프, 비동기 처리, 요청 스코프 상태 검증
(9)forwardedUrl : 이동대상의 경로 검증
public ResultActions perform(String url, MediaType mediaType,
Map usernamePasswordMap) throws Exception {
return mockMvc.perform(MockMvcRequestBuilders.
post(url)
.contentType(mediaType)
.content(objectMapper.writeValueAsString(usernamePasswordMap)));
// map타입이 String타입의 JSON으로 변환된다
}
@Test
@DisplayName("login_success")
void loginSuccess() throws Exception {
//given
Map usernamePasswordMap = getUsernamePasswordMap(USERNAME, PASSWORD);
//when
perform(LOGIN_URL, MediaType.APPLICATION_JSON, usernamePasswordMap)
.andDo(print())
.andExpect(status().isOk())
.andReturn();
}
(1)andDo() : print, log를 사용할 수 있는 메소드
(2)print() : 실행결과를 지정해준 대상으로 출력, default = System.out
(3)log() : 실행결과를 디버깅 레벨로 출력, 레벨은 org.springframework.test.web.servlet.result
(4)스테틱 메서드
1. MockMvcRequestBuilders 요청 데이터를 설정할 때 사용
private ResultActions perform(String url, MediaType mediaType, Map usernamePasswordMap) throws Exception {
return mockMvc.perform(MockMvcRequestBuilders
.post(url)
.contentType(mediaType)
.content(objectMapper.writeValueAsString(usernamePasswordMap)));