스프링부트 테스트는 주로 다음과 같이 나뉜다.
Mock 객체는 테스트 환경에서 실제 객체를 대신하여 동작하는 가짜 객체이다. 원하는 동작을 시뮬레이션하거나 특정 결과를 반환하도록 설정할 수 있어, 테스트를 단순화하고 실행 속도를 빠르게 한다.
장점
Mock 객체를 사용하는 경우
1. 외부 API와의 연동 테스트
외부 API가 느리거나 비싸게 동작할 수 있으므로, Mock객체로 빠르고 안전한 테스트 가능
2. 데이터베이스를 사용하지 않아도 되는 경우
단순 서비스 로직 테스트
3. 실패 시나리오 테스트
네트워크 오류, API 타임아웃 등을 시뮬레이션
Mock 객체를 사용한 테스트 예제 :
@ExtendWith(MockitoExtension.class)
class WeatherServiceTest {
@Mock
private WeatherApiClient weatherApiClient;
@InjectMocks
private WeatherService weatherService;
@Test
void getWeather_returnsMockedData() {
when(weatherApiClient.fetchWeather("Seoul"))
.thenReturn(new WeatherResponse("Sunny", 25));
WeatherResponse response = weatherService.getWeather("Seoul");
assertEquals("Sunny", response.getCondition());
assertEquals(25, response.getTemperature());
}
}
실제 로직 테스트는 Mock 객체를 사용하지 않고, 실제 데이터베이스나 외부 API를 호출하여 동작을 검증한다. 주로 통합 테스트에서 활용되며, Mock 테스트가 제공하지 못하는 상호작용과 데이터 흐름을 확인할 수 있다.
장점
실제 테스트가 필요한 경우
1. 서비스와 레포지토리 간 상호작용 검증 -> 데이터베이스 CRUD 테스트
2. 외부 API 호출 테스트 -> Mock이 아닌 실제 API를 호출하여 데이터의 정확성 확인
3. 전체적인 시스템 동작 확인
컨트롤러 -> 서비스 -> 레포지토리 흐름이 올바르게 작동하는지 검증
실제 로직을 사용한 테스트 예제 :
@SpringBootTest
class WeatherServiceIntegrationTest {
@Autowired
private WeatherService weatherService;
@Test
void getWeather_returnsActualData() {
WeatherResponse response = weatherService.getWeather("Seoul");
assertNotNull(response);
assertTrue(response.getTemperature() > -50); // 온도 범위 예시
}
}
Mock으로 단위 테스트를 작성해 개별 로직을 빠르게 검증한다.
통합 테스트에서는 Mock 없이 실제 리소스를 사용해 전체적인 동작을 확인한다.
외부 API 테스트는 Mock으로 기본적인 동작을 확인하고, 필요 시 실제 API를 호출하는 테스트를 추가한다.
결론적으로, Mock 테스트는 빠르고 예측 가능한 테스트에 유리하고 실제 테스트는 데이터 흐름과 전체적인 시스템 동작을 검증하는데 필수적이다.