관리 메뉴

개발하는 동그리

[Test] Slice Test (API 계층) 본문

IT 정보/Spring

[Test] Slice Test (API 계층)

개발하는 동그리 2022. 8. 18. 14:07
반응형

API 계층 테스트 기본 구조

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.test.web.servlet.MockMvc;

@SpringBootTest       // (1)spring boot 기반의 애플리케이션 테스트를 위한 application context 생성
		      // -> Application Context는 애플리케이션에 필요한 Bean 객체가 등록되어 있다.
@AutoConfigureMockMvc  // (2)테스트에 필요한 애플리케이션의 구성이 자동 진행,  MockMvc 같은 기능 사용에 필요
                       
public class ControllerTestDefaultStructure {
		
        // (3) DI로 주입받은 MovkMvc는 Tomcat 같은 서버를 실행하지 않고 Spring기반의 애플리케이션을  
        // 테스트 할 수 있는환경을 제공하는 Spring MVC 테스트 프레임 워크
        // MocvMvc 객체를 통해 우리가 작성한 Controller를 호출하고 테스트를 진행할 수 있다.
    @Autowired
    private MockMvc mockMvc; 
    
		
    @Test
    public void postMemberTest() {
        // given 
        //(4) 테스트용 request body 생성
        
        // when 
        //(5) MockMvc 객체를 통해 요청 URL, HTTP 메서드등을 지정하고, request body에 추가한 뒤
        // request 수행 / 테스트 대상 Controller 호출
        
        // then 
        //(6) Controller 핸들러 메서드에서 응답으로 수신한 HTTP Status 및 response body 검증 
    }
}

 

API 계층 테스트 세부 구조 (예시 포함)

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.status;

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

    @Autowired
    private Gson gson;

    @Test
    void postMemberTest() throws Exception {
        // given  
        // (1) request body에 포함시키는 요청데이터
        MemberDto.Post post = new MemberDto.Post("moodaery@gmail.com",
                                                        "춘식",
                                                    "010-1234-5678");
        // (2) json 포멧으로 변환
        String content = gson.toJson(post); 

        // when
        ResultActions actions =
                // (3) perform() 메서드를 통해 Controll 호출의 세부적 정보 포함
                mockMvc.perform(                      
                                    // (4) HTTP METHOD와 request URL 정보
	                                post("/members")
                                        // (5) return 받을 응답 데이터 type 설정
                                        .accept(MediaType.APPLICATION_JSON) 
                                        // (6) 메서드를 통해 서버에서 처리 가능한 Content Type 설정
                                        .contentType(MediaType.APPLICATION_JSON) 
                                        // (7) request body 데이터 설정
                                        .content(content) 
                                );

        // then 
        // (8) 위 perform() 메서드는 ResultActions 타입의 객체를 리턴
        MvcResult result = actions
            // (9) andExpect() 메서드를 통해 파라미터로 입력한 Macher로 예상되는 기대 결과를 검증
            .andExpect(status().isCreated())
            // (10) jsonPath를 통해서 json 형식의 개별 프로퍼티에 쉽게 접근가능
            .andExpect(jsonPath("$.data.email").value(post.getEmail())) 
            // 대부분의 검증은 여기까지 마무리..

            // (11) andReturn() 을 통해서 response 데이터 확인을 할 수 있으며, 디버깅 용도로 출력할 수 있다
            .andReturn(); 

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

 

반응형