Controller 테스트 코드 작성하기

최준영·2022년 8월 5일
3

프로젝트 관련

목록 보기
4/6
post-custom-banner

전에 만든 개인 프로젝트에서는 controller 테스트 코드를 작성하지 않았다. 대신 PostMan으로 하나하나 테스트를 했었다. 보다 안정적인 애플리케이션을 위해 이번 협업 프로젝트에서는 Controller 테스트 코드를 작성해보았다.

Controller 테스트

1. @WebMvcTest

@WebMvcTest(controllers = MemberController.class)
class MemberControllerTest {
  • 여러 스프링 테스트 어노테이션 중, Web(Spring MVC)에 집중할 수 있는 어노테이션이다.
  • @SpringBootTest는 모든 빈을 로드한다. 따라서 Controller 레이어만 테스트 하고 싶다면 @WebMvcTest를 사용하는 것이 좋다.
  • 선언할 경우 다음 내용만 스캔하도록 제한한다.
    • @Controller
    • @ControllerAdvice
    • @JsonComponent
    • Converter / GenericConverter
    • Filter
    • WebSecurityConfigurerAdapter
    • WebMvcConfigurer
    • HandlerMethodArgumentResolver

2. MockMvc

MockMvc mvc;
    
@BeforeEach
public void setup() {
    this.mvc = MockMvcBuilders.webAppContextSetup(context)
        .addFilter(new CharacterEncodingFilter("UTF-8", true))
        .alwaysDo(print())
        .build();
}
  • 스프링 MVC 테스트의 시작점이다.
  • 이 클래스를 통해 HTTP GET, POST 등에 대한 API 테스트를 할 수 있다.
  • @Autowired로 실행하면 한글 깨짐 현상이 발생해서 별도로 설정해주었다.

3. @MockBean


MockMvc mvc;

@MockBean
MemberService memberService;
  • 가짜 객체를 만들어 컨테이너가 주입할 수 있도록 한다.
  • 가짜 객체이므로 실제 행위를 하지 않는다.
  • MockitoBDDMockito를 사용하여 원하는 행위를 할 수 있도록 정의할 수 있다.
AlcoholDetailsDto alcoholDetails = AlcoholDetailsDto.of(
    alcohol, alcohol.getFileName(), "3", List.of(), List.of(), true);

given(alcoholService.getAlcoholDetails(anyLong(), anyLong()))
    .willReturn(alcoholDetails);

4. MockMvc의 메소드

//given
MockHttpSession session = new MockHttpSession();
session.setAttribute(SessionConst.LOGIN_MEMBER, new LoginMember(1L, "nickname"));

//when
//then
mvc.perform(patch("/reviews/0/edit")
        .session(session)
        .contentType(MediaType.APPLICATION_JSON)
        .accept(MediaType.APPLICATION_JSON)
        .characterEncoding("UTF-8")
        .content("{\"grade\" :  3, \"content\" :  \"테스트 댓글\"}"))
    .andExpect(status().isBadRequest())
    .andExpect(jsonPath("$.status").value("400"))
    .andExpect(jsonPath("$.message").value("리뷰 고유 번호는 0보다 커야합니다."));

1) perfom()

  • HTTP 요청을 할 수 있다.
  • 체이닝이 지원되어 여러 검증 기능을 이어서 선언할 수 있다.

2) andExcept()

  • mvc.perform의 결과를 검증한다.
  • status() : 상태 코드를 검증할 수 있다.
  • view() : 리턴하는 뷰에 대해 검증한다.
    • ex) andExcept(view().name("/detailpage"))
  • redirectedUrl() : 리다이렉트 url을 검증한다.
    • ex) redirectedUrl("/where");
  • model() : 컨트롤러의 Model에 관해 검증한다.
    • ex) model().attribute("alcoholDetails", alcoholDetails)
    • ex) model().attributeHasFieldErrorCode("loginForm", "userId", "NotBlank")
  • content() : 응답에 대한 정보를 검증한다.
  • jsonPath() : response body에 들어갈 json 데이터를 검증한다.
    • ex) jsonPath("$.status").value("400")

3) andDo()

  • 요청/응답 전체 메세지를 확인할 수 있다.

참고자료

profile
do for me
post-custom-banner

0개의 댓글