TIL
항해99_WIL220724
Hyeongjun_Ham
2022. 7. 24. 14:30
이번 주 주로 한 것 : 테스트 코드작성
테스트 코드를 짜면서 이게 어디 검사할 수 있는 것도 아니고 잘 짠 건지 모르겠다.
사용한 어노테이션 정리
@WebMvcTest
- Spring MVC Controller가 예상대로 동작되는지 테스트할 때 사용
- 테스트를 위해서 특정 어노테이션을 가진 Bean만 스캔한다는 것이 특징
- 단일 컨트롤러를 대상으로 테스트가 가능하고, MockBean과 함께 사용한다.
- Mock을 사용하면, full HTTP server를 실행할 필요 없이 MVC Controller테스트를 빠르게 테스트할 수 있다.
@MockBean
- 껍데기만 있는 객체를 얘기한다.
@ExtendWith
- 확장 기능을 구현할 대 사용한다.
컨트롤러 테스트
@Test
@DisplayName("회원가입 요청")
void signup() throws Exception {
SignupRequestDto signupRequestDto = new SignupRequestDto();
signupRequestDto.setUsername("test@naver.com");
signupRequestDto.setNickname("test");
signupRequestDto.setPassword("test123");
String content = objectMapper.writeValueAsString(signupRequestDto);
mvc.perform(post("/api/users/signup")
.content(content)
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andDo(print());
}
서비스 테스트
@Test
@DisplayName("로그인 성공")
void login() {
//given
this.memberService = new MemberService(
passwordEncoder,
memberRepository,
basicItemRegister,
jwtTokenProvider
);
username = "test@naver.com";
password = "password";
LoginRequestDto loginRequestDto = new LoginRequestDto();
loginRequestDto.setUsername(username);
loginRequestDto.setPassword(password);
given(memberRepository.findByUsername(loginRequestDto.getUsername()))
.willReturn(Optional.ofNullable(existMember));
HttpServletResponse response = new Response();
//when
Member result = memberService.login(loginRequestDto, response);
//then
Assertions.assertEquals(existMember, result);
Assertions.assertEquals(existMember.getId(), result.getId());
Assertions.assertEquals(existMember.getUsername(), result.getUsername());
Assertions.assertEquals(existMember.getNickname(), result.getNickname());
Assertions.assertEquals(existMember.getPassword(), result.getPassword());
}
처음엔 복잡하지만 한 1000줄 정도 쓰다 보면 중복도 많아지고, 실패 경우를 어떻게 테스트해야 하나 알 수 있었다.
쓰다 보니 중복이 많은 거는 나중에 다 리팩토링 해야 하나 싶기도 하다.
그런데 중복을 BeforeEach로 넣으면 테스트 코드 보고 이게 뭐를 의미하나 모를 거 같기도 하고..
고민을 해봐야겠다.