통합 테스트는 전체 애플리케이션 컨텍스트를 로드하여 실제 운영 환경과 유사한 조건에서 컴포넌트 간의 상호작용과 전체 시스템의 동작을 검증하는 데 목적이 있으며, 주로 @MockBean
과 MockMvc
를 활용해 테스트한다. 반면, 단위 테스트는 특정 클래스나 메서드를 외부 의존성과 격리된 상태에서 검증하여 기능의 정확성을 빠르고 효율적으로 확인하는 데 초점을 두며, @Mock
, @InjectMocks
, Mockito
등을 사용해 최소한의 환경에서 테스트를 수행한다.
통합 테스트는 전체 Spring Boot 애플리케이션 컨텍스트(ioc)를 로드하여, 실제 환경과 유사한 조건에서 컨트롤러의 동작을 검증하는 테스트다. (DB, 서비스, 리포지토리, 시큐리티 등 모든 설정을 포함한 환경에서 테스트)
그 목적은 모듈 간 인터페이스, 데이터 흐름, 그리고 외부 시스템과의 연동이 제대로 작동하는지를 확인하는 데 있다. MockMvc를 사용해 HTTP 요청을 모의로 보내고, 그에 대한 응답을 검증합니다.
@SpringBootTest
와 함께 사용.MockMvc
를 자동으로 설정해줌.application-test.yml
을 로드하고 싶을 때 → 운영에서는 실제 DB, 보안 설정, API 키 등을 사용하지만 테스트에서는 가짜 DB, 간단한 보안 설정, mock 서버 등을 쓰고 싶을 때 사용한다.@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란?
MockMvc
는 Spring MVC의 HTTP 요청/응답 과정을 서버를 실제로 띄우지 않고 시뮬레이션할 수 있게 도와주는 테스트 도구즉, 실제 웹 서버 없이도 →
- 컨트롤러에 HTTP 요청을 보내고
- 응답을 받아서
- 상태 코드, JSON 값, 헤더 등을 검증할 수 있다.
⭐️ ObjectMapper란?
ObjectMapper
는 Jackson이라는 JSON 라이브러리의 핵심 클래스 중 하나로, 자바 객체와 JSON 문자열 간 변환을 도와주는 도구
MockMvc
를 사용할 때, HTTP 요청에 JSON 바디를 담아 전송하려면 @RequestBody
와 호환되도록 자바 객체를 JSON 문자열로 변환해야 하는데, 이때 ObjectMapper
가 필요하다.