<aside> 📌 여기서 설명하는 코드는 Spring 기반 애플리케이션의 컨트롤러를 MockMvc를 통해 서비스 로직과 DB까지 접근하게 되므로 Slice 테스트라고는 할 수 없다. 하지만 MVC 동작을 테스트하는 코드를 작성하는 것에 중점을 둔다.

</aside>

@SpringBootTestMockMVC를 통한 테스트

아래 예제 코드를 보자.

import com.codestates.member.dto.MemberDto;
import com.google.gson.Gson;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.ResultActions;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@SpringBootTest
@AutoConfigureMockMvc
class MemberControllerTest2 {
    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private Gson gson;

    @Test
    void postMemberTest() throws Exception {
        // given
        MemberDto.Post post = new MemberDto.Post("[email protected]",
                                                        "홍길동",
                                                    "010-1234-5678");
        String content = gson.toJson(post);

        // when
        ResultActions actions =
                mockMvc.perform(
                                    post("/v11/members")
                                        .accept(MediaType.APPLICATION_JSON)
                                        .contentType(MediaType.APPLICATION_JSON)
                                        .content(content)
                                );

        // then
        MvcResult result = actions
                                .andExpect(status().isCreated())
                                .andExpect(jsonPath("$.data.email").value(post.getEmail()))  // (1)
                                .andExpect(jsonPath("$.data.name").value(post.getName()))   // (2)
                                .andExpect(jsonPath("$.data.phone").value(post.getPhone())) // (3)
                                .andReturn();

        System.out.println(result.getResponse().getContentAsString());
    }
}

@SprinBootTest

스프링부트 환경에서 쉽게 테스트를 실행할 수 있도록 설정해준다.