Spring에서의 테스트 코드

통합 테스트는 전체 애플리케이션 컨텍스트를 로드하여 실제 운영 환경과 유사한 조건에서 컴포넌트 간의 상호작용과 전체 시스템의 동작을 검증하는 데 목적이 있으며, 주로 @MockBeanMockMvc를 활용해 테스트한다. 반면, 단위 테스트는 특정 클래스나 메서드를 외부 의존성과 격리된 상태에서 검증하여 기능의 정확성을 빠르고 효율적으로 확인하는 데 초점을 두며, @Mock, @InjectMocks, Mockito 등을 사용해 최소한의 환경에서 테스트를 수행한다.

1️⃣ 통합 테스트

통합 테스트는 전체 Spring Boot 애플리케이션 컨텍스트(ioc)를 로드하여, 실제 환경과 유사한 조건에서 컨트롤러의 동작을 검증하는 테스트다. (DB, 서비스, 리포지토리, 시큐리티 등 모든 설정을 포함한 환경에서 테스트)

그 목적은 모듈 간 인터페이스, 데이터 흐름, 그리고 외부 시스템과의 연동이 제대로 작동하는지를 확인하는 데 있다. MockMvc를 사용해 HTTP 요청을 모의로 보내고, 그에 대한 응답을 검증합니다.

✅ 주요 어노테이션

  1. @SpringBootTest
  2. @AutoConfigureMockMvc
  3. @Transactional
  4. @TestConfiguration
  5. @ActiveProfiles("test")

👉 사용 예시

@SpringBootTest
@AutoConfigureMockMvc
@Transactional
class MemberControllerTest {

    @Autowired
    private MockMvc mockMvc; ⭐️

    @Autowired
    private ObjectMapper objectMapper; ⭐️

    @Autowired
    private JdbcMemberRepository jdbcMemberRepository;

    private final String email = "[email protected]";
    private final String password = "123456";
    private final String nickname = "tester";

    @BeforeEach
    void setUp() {
        jdbcMemberRepository.save(new Member(email, password, nickname));
    }

    @Test
    void signInSuccessTest() throws Exception {
        SignInRequestDTO request = new SignInRequestDTO(email, password);
        mockMvc.perform(post("/auth") // MockMvc를 사용해서 가짜 HTTP 요청을 보냄.
                        .contentType(MediaType.APPLICATION_JSON) // JSON 데이터를 보내는 요청임을 서버에 알림
                        .content(objectMapper.writeValueAsString(request))) // 실제 HTTP 요청의 본문(body)을 설정하는 메서드
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.code").value("SU")) // JSON에서 code 키를 가리키는 JSONPath 표현식
                .andExpect(jsonPath("$.user_id").isNumber());
    }
}

⭐️ MockMvc란?

MockMvcSpring MVC의 HTTP 요청/응답 과정을 서버를 실제로 띄우지 않고 시뮬레이션할 수 있게 도와주는 테스트 도구

즉, 실제 웹 서버 없이도 →

⭐️ ObjectMapper란? ObjectMapper는 Jackson이라는 JSON 라이브러리의 핵심 클래스 중 하나로, 자바 객체와 JSON 문자열 간 변환을 도와주는 도구

MockMvc를 사용할 때, HTTP 요청에 JSON 바디를 담아 전송하려면 @RequestBody와 호환되도록 자바 객체를 JSON 문자열로 변환해야 하는데, 이때 ObjectMapper가 필요하다.

2️⃣ 단위 테스트