개발 무지렁이

[Spring Boot] MockMvc를 이용한 테스트 본문

Backend/스프링부트

[Spring Boot] MockMvc를 이용한 테스트

Gaejirang-e 2022. 12. 7. 14:50

MockMvc


가짜 객체를 만들어, 애플리케이션 서버에 배포하지 않고도
테스트용으로 시뮬레이션해서
스프링 MVC 동작을 재현할 수 있는 유틸리티 클래스를 말한다.
(요청 및 전송, 응답기능)

ResultActions 객체

결과로 ResultActions 객체를 받으며,
리턴값을 검증할 수 있는 andExpect() 메서드 제공

import static org.hamcrest.Matchers.containsString;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@SpringBootTest
@AutoConfigureMockMvc // MVC 테스트 포함 모든 설정을 같이 올린다.
@Transactional // 여기서 수행된 것들이 DB에 반영되지 안되게
class AppTests {
    @Autowired
    private MockMvc mvc;

    @Test
    @DisplayName("메인화면에서는  안녕이 나와야 한다.")
    void t1() throws Exception {
        ResultActions resultActions = mvc
            .perform(get("/"))
            .andDo(print());

        resultActions
            .andExpect(status().is2xxSuccessful())
            .andExpect(handler().handlerType(HomeController.class))
            .andExpect(handler().methodName("main"))
            .andExpect(content().string(containsString("안녕")));
    }

    @Test
    @DisplayName("user1로 로그인 후 프로필페이지에 접속하면 user1의 이메일이 보여야 한다.")
    void t3() throws Exception {
        ResultActions resultActions = mvc
                .perform(
                        get("/member/profile")
                                .with(user("user1").password("1234").roles("user"))
                )
                .andDo(print());

        resultActions
                .andExpect(status().is2xxSuccessful())
                .andExpect(handler().handlerType(MemberController.class))
                .andExpect(handler().methodName("showProfile"))
                .andExpect(content().string(containsString("user1@test.com")));
    }

    @Test
    @DisplayName("회원가입")
    void t5() throws Exception {
        String testUploadFileUrl = "https://picsum.photos/200/300";
        String originalFileName = "test.png";

        // wget
        RestTemplate restTemplate = new RestTemplate(); // Rest방식으로 API를 호출할 수 있는 스프링 내장 클래스

        ResponseEntity<Resource> response = restTemplate.getForEntity(testUploadFileUrl, Resource.class);
        // ResponseEntity: 요청처리 결과 및 HTTP 상태코드를 설정하여 응답할 수 있는 클래스
        // .getForEntity(): 주어진 url주소를 HTTP GET방식으로, 결과는 ResponseEntity로 반환

        InputStream inputStream = response.getBody().getInputStream();

        MockMultipartFile profileImg = new MockMultipartFile(
                "profileImg",
                originalFileName,
                "image/png",
                inputStream
        );

        ResultActions resultActions = mvc
                .perform(
                        multipart("/member/join")
                                .file(profileImg)
                                .param("username", "user5")
                                .param("password", "1234")
                                .param("email", "user5@test.com")
                                .characterEncoding("UTF-8")
                )
                .andDo(print());

        resultActions
                .andExpect(status().is3xxRedirection())
                .andExpect(redirectedUrl("/member/profile"))
                .andExpect(handler().handlerType(MemberController.class))
                .andExpect(handler().methodName("join"));

        Member member = memberService.getMemberById(5L);
        assertThat(member).isNotNull();
    }
}
❓ HTTP 상태코드
- 200 ~ 299 : Success
- 300 ~ 399 : Redirection
- 400 ~ 499 : 실패 (My fault)
- 500 ~ 999 : 실패 (Server's fault)
Comments