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로 넣으면 테스트 코드 보고 이게 뭐를 의미하나 모를 거 같기도 하고..

고민을 해봐야겠다.