[스프링부트3] 테스트 코드 실제로 작성해보기

package com.example.springboot3.test;

import com.example.springboot3.MemberRepository;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
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;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

@SpringBootTest // 스프링 컨텍스트를 로드하여 테스트에 사용
@AutoConfigureMockMvc // MockMvc를 사용하기 위해 선언
public class TestControllerTest {
    @Autowired
    protected MockMvc mockMvc;
    
    @Autowired
    private WebApplicationContext context;
    
    @Autowired
    private MemberRepository memberRepository;
    
    @BeforeEach // 테스트 실행 전 실행하는 메서드
    public void mockMvcSetUp() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(context)
                                      .build();
    }
    
    @AfterEach // 테스트 실행 후 실행하는 메서드
    public void cleanUp() {
        memberRepository.deleteAll();
    }
    
}

테스트 환경 설정

  1. @SpringBootTest
    • 설명
      • 메인 어플리케이션 클래스에 포함된 빈을 찾아 테스트용 애플리케이션 컨텍스트를 생성
  1. @AutoConfigureMockMvc
    • 설명
      • MockMvc 인스턴스를 자동으로 구성함.
      • HTTP 요청을 보내고 응답을 검증할 수 있는 테스트 환경을 만듬.

테스트 실행 전/후 작업

  1. @BeforeEach
    • 설명
      • 테스트 실행 전에 특정 작업을 수행하는 메서드에 해당 에너테이션을 적용
      • 테스트 데이터 준비 혹은 테스트 환경 설정에 사용함.
     @BeforeEach // 테스트 실행 전 실행하는 메서드
        public void mockMvcSetUp() {
            this.mockMvc = MockMvcBuilders.webAppContextSetup(context)
                                          .build();
        }
  1. @AfterEach
    • 설명
      • 테스트 실행 후에 특정 작업을 수행하는 메서드에 해당 애너테이션을 적용함.
      • 테스트 데이터 정리환경 복원에 사용
    @AfterEach
    public void cleanUp() {
        memberRepository.deleteAll();
    }

실제 테스트

package com.example.springboot3.test;

import com.example.springboot3.Member;
import com.example.springboot3.MemberRepository;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
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.ResultActions;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

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

@SpringBootTest // 스프링 컨텍스트를 로드하여 테스트에 사용
@AutoConfigureMockMvc // MockMvc를 사용하기 위해 선언
public class TestControllerTest {
    @Autowired
    protected MockMvc mockMvc;
    
    @Autowired
    private WebApplicationContext context;
    
    @Autowired
    private MemberRepository memberRepository;
    
    @BeforeEach // 테스트 실행 전 실행하는 메서드
    public void mockMvcSetUp() {
        this.mockMvc = MockMvcBuilders
            .webAppContextSetup(context)
            .build();
    }
    
    @DisplayName(" getAllMembers: 아티클 조회에 성공한다.")
    @Test
    public void getAllMembers() throws Exception {
        // given
        final String url = "/test";
        Member savedMember = memberRepository.save(new Member(1L, "홍길동"));
        // when
        final ResultActions result = mockMvc.perform(get(url).accept(MediaType.APPLICATION_JSON));
        // then
        result
            .andExpect(status().isOk())
            .andExpect(jsonPath("$[0].id").value(savedMember.getId()))
            .andExpect(jsonPath("$[0].name").value(savedMember.getName()));
    }
    
    @AfterEach // 테스트 실행 후 실행하는 메서드
    public void cleanUp() {
        memberRepository.deleteAll();
    }
    
}
  • 테스트 시나리오
    • @DisplayName
      • getAllMembers : 아티클 조회에 성공한다.
  • 패턴 분석
    1. Given
      1. 멤버를 저장
    1. When
      1. 멤버 리스트를 조회하는 API를 호출
    1. Then
      1. 응답 코드 200 , 반환받은 값중에 0 번쨰 요소의 id 와 name 이 저장된 값과 같은지 확인
  • 코드 설명
    1. mockMvc.perform(get(url)
      1. MockMvc 를 사용하여 특정 URL 로 GET 요청을 보냅니다.
    1. accept(MediaType.APPLICATION_JSON)
      1. JSON 형태의 응답을 받기를 기대합니다.
    1. andExpect(status().isOk())
      1. HTTP 응답 코드가 200 OK인지 확인합니다.
    1. andExpect(jsonPath("$[0].id").value(savedMember.getId()))
      1. JSON 응답의 0번째 요소의 id 값이 저장된 멤버의 id 값과 일치하는지 확인합니다.


Uploaded by N2T