-
1. 🧩 Spring 테스트의 기본: @SpringBootTest
-
🔍 @SpringBootTest란?
-
🏗️ Application Context 초기화의 특징
-
사용 예시
-
2. 🛠️ @MockBean: Mock 객체를 Application Context에 등록하기
-
🔍 @MockBean의 역할
-
사용 예시
-
3. 🧪 @Mock과 @InjectMocks: Mockito 기반의 단위 테스트
-
🔍 @Mock과 @InjectMocks란?
-
사용 예시
-
4. 🚀 @SpringBootTest vs Mockito 테스트: 언제 사용할까?
-
🔑 @SpringBootTest를 사용하는 상황
-
🔑 Mockito 기반 테스트를 사용하는 상황
-
5. 📈 성능 최적화: @SpringBootTest를 사용할 때 주의할 점
-
초기화가 일어나는 경우
-
성능 최적화 팁
-
6. 🧾 정리: Mock VS MockBean 비교표
이전 글에서 Spring에서의 단위테스트와 통합테스트에 대해 간략하게 정리해 보았습니다.
[JAVA] Spring을 이용한 테스트 코드 작성 방법 (단위 테스트, 통합 테스트)
[JAVA] Spring을 이용한 테스트 코드 작성 방법 (단위 테스트, 통합 테스트)
소프트웨어 개발에서 테스트 코드는 단순히 오류를 찾는 도구를 넘어, CI/CD(Continuous Integration/Continuous Deployment) 파이프라인과 개발 생산성 향상에 핵심적인 역할을 합니다.이 글에서는 JPA를 사용
tae-hui.tistory.com
이번 글에서는 해당 내용에 대해 조금 더 깊에 알아보려고 합니다. 특히, Mock 객체와 MockBean의 차이점, 통합테스트에서의 Application Context 초기화
, 그리고 성능 최적화 방법을 자세히 정리했습니다.
1. 🧩 Spring 테스트의 기본: @SpringBootTest
🔍 @SpringBootTest란?
@SpringBootTest
는 Spring Boot 애플리케이션 전체를 초기화하며, 통합 테스트를 위한 환경을 제공합니다. 이 애노테이션을 선언하면 애플리케이션 컨텍스트(Application Context)가 생성되고, 컨텍스트에 등록된 @Service
, @Repository
, @Component
같은 빈들을 사용할 수 있습니다.
🏗️ Application Context 초기화의 특징
- Application Context는 등록된 빈만 사용 가능:
@SpringBootTest
는 애플리케이션 전체 컨텍스트를 초기화하기 때문에, 테스트 대상 클래스에서 등록되지 않은 빈은 사용할 수 없습니다. - 모든 의존성이 반드시 빈이어야 함: 테스트 클래스에서 의존성을 주입받으려면, 해당 의존성이 반드시 Application Context에 등록되어 있어야 합니다.
장점
- 실제 환경과 유사한 테스트 환경 제공: 실제 애플리케이션과 동일한 컨텍스트에서 동작합니다.
- 빈 의존성 테스트 가능: 의존성 주입이나 컨텍스트 설정이 올바른지 확인할 수 있습니다.
단점
- 속도가 상대적으로 느림: 애플리케이션 컨텍스트를 초기화하는 데 시간이 걸리기 때문에, 작은 단위 테스트보다는 통합 테스트에 적합합니다.
사용 예시
@SpringBootTest
public class ExampleServiceTest {
@Autowired
private ExampleService exampleService;
@Test
public void testServiceLogic() {
String result = exampleService.doSomething();
assertEquals("ExpectedValue", result);
}
}
Tip:
@SpringBootTest
는 애플리케이션 전체를 테스트할 때 유용합니다. 하지만 모든 테스트에서 사용하면 속도 문제가 생길 수 있으니 필요한 경우에만 해야합니다.
2. 🛠️ @MockBean: Mock 객체를 Application Context에 등록하기
🔍 @MockBean의 역할
@MockBean
은 Spring의 Mock 객체를 Application Context에 등록하는 방법입니다. 실제 빈 대신 Mock 객체를 주입하여 테스트에 활용할 수 있습니다.
주요 특징
- Mock 객체를 사용하면서도, Spring 컨텍스트와 연동된 테스트를 수행할 수 있습니다.
- Mock 객체의 동작을 정의하여 원하는 시나리오를 검증할 수 있습니다.
사용 예시
@SpringBootTest
public class ExampleServiceTest {
@MockBean
private ExampleRepository exampleRepository;
@Autowired
private ExampleService exampleService;
@Test
public void testMockRepository() {
// Mock 동작 정의
when(exampleRepository.getData()).thenReturn("MockData");
String result = exampleService.processData();
assertEquals("Processed MockData", result);
}
}
장점
- 통합 테스트 가능: Mock 객체를 주입하더라도 실제 컨텍스트를 초기화하여 전반적인 시스템을 테스트할 수 있습니다.
- 테스트 대상의 의존성 대체: 특정 클래스의 테스트에서만 Mock 객체를 사용하고, 나머지는 실제 빈으로 동작합니다.
단점
@SpringBootTest
와 함께 사용되므로 테스트 속도가 느릴 수 있습니다.
3. 🧪 @Mock과 @InjectMocks: Mockito 기반의 단위 테스트
🔍 @Mock과 @InjectMocks란?
@Mock
은 Mock 객체를 생성하고, @InjectMocks
는 해당 Mock 객체를 주입하여 테스트 대상을 초기화합니다. Spring 컨텍스트를 전혀 사용하지 않고 순수하게 Mockito 프레임워크만으로 테스트를 수행합니다.
사용 예시
@RunWith(MockitoJUnitRunner.class)
public class ExampleServiceTest {
@Mock
private ExampleRepository exampleRepository;
@InjectMocks
private ExampleService exampleService;
@Test
public void testUsingMockito() {
// Mock 동작 정의
when(exampleRepository.getData()).thenReturn("MockData");
String result = exampleService.processData();
assertEquals("Processed MockData", result);
}
}
장점
- 빠른 테스트 속도: Spring 컨텍스트를 초기화하지 않아 매우 빠릅니다.
- 간단한 구조: 단위 테스트 작성이 용이하며, 특정 메서드나 클래스의 동작을 독립적으로 검증할 수 있습니다.
단점
- Spring 컨텍스트를 활용하지 않기 때문에, 빈의 의존성이나 설정 검증은 불가능합니다.
4. 🚀 @SpringBootTest vs Mockito 테스트: 언제 사용할까?
🔑 @SpringBootTest를 사용하는 상황
- 통합 테스트가 필요한 경우: 여러 계층(Service, Repository 등)을 함께 테스트해야 할 때.
- 빈 의존성 확인: 의존성 주입 및 설정이 올바른지 확인해야 할 때.
- Spring Boot 애플리케이션 전체 동작 검증: 실제 환경과 유사한 테스트 환경이 필요할 때.
🔑 Mockito 기반 테스트를 사용하는 상황
- 단위 테스트: 특정 메서드나 클래스만 독립적으로 검증해야 할 때.
- 빠른 테스트가 필요한 경우: 컨텍스트 초기화 없이 간단히 동작을 확인할 때.
5. 📈 성능 최적화: @SpringBootTest를 사용할 때 주의할 점
@SpringBootTest
를 사용하면 Application Context의 초기화가 일어나기 때문에 속도가 느릴 수 있습니다. 하지만 Spring Boot는 컨텍스트 캐싱을 활용하여 동일한 컨텍스트를 재사용하므로, 설정이 변경되지 않는 한 성능 문제가 심각하지 않습니다.
초기화가 일어나는 경우
- 설정이 다르거나 캐싱 조건을 만족하지 못하는 경우
- 다른 프로파일 사용
@ActiveProfiles
로 지정된 프로파일이 다르면 별도의 Context를 초기화합니다.
- 다른 설정 클래스
@SpringBootTest(classes = ...)
로 지정된 설정이 다르면 매번 초기화합니다.
@DirtiesContext
사용
- 특정 테스트가 Context를 더럽혔다고 표시하면, 이후 테스트는 새로운 Context를 초기화합니다.
성능 최적화 팁
- WebEnvironment 설정: 테스트 환경의 WebEnvironment를
NONE
으로 설정하면 불필요한 서버 초기화를 방지할 수 있습니다. @SpringBootTest(webEnvironment = WebEnvironment.NONE) public class ExampleServiceTest { // Test logic here }
- 테스트 분리: 통합 테스트(
@SpringBootTest
)와 단위 테스트(Mockito 기반)를 명확히 분리하여 필요 이상으로 컨텍스트를 초기화하지 않도록 합니다.
6. 🧾 정리: Mock VS MockBean 비교표
항목 | @MockBean |
@Mock + @InjectMocks |
Spring Context 초기화 여부 | 초기화함 | 초기화하지 않음 |
테스트 속도 | 상대적으로 느림 | 매우 빠름 |
빈 의존성 테스트 | 가능 | 불가능 |
사용 용도 | 통합 테스트 | 단위 테스트 |
핵심 요약
@SpringBootTest
: 애플리케이션 전체 컨텍스트를 초기화하기 때문에, 테스트 대상 클래스에서 등록되지 않은 빈은 사용할 수 없다.@MockBean
: 통합 테스트에서 유용하며, Application Context와 연동된 Mock 객체를 생성합니다.@Mock
: 빠른 단위 테스트에 적합하며, Spring과 독립적으로 동작합니다.
'Java' 카테고리의 다른 글
[JAVA] Spring Boot 대규모 트래픽 처리 #Redis #Scheduler (2) | 2025.01.14 |
---|---|
[JAVA] Spring을 이용한 테스트 코드 작성 방법 (단위 테스트, 통합 테스트) (0) | 2025.01.11 |
[JAVA] ArrayList vs LinkedList 완벽 정리 (0) | 2024.12.31 |
[JAVA] PriorityQueue 설명 및 사용법 (0) | 2024.12.30 |
[JAVA] Queue와 Deque 무엇이 좋을까? (2) | 2024.12.27 |
이전 글에서 Spring에서의 단위테스트와 통합테스트에 대해 간략하게 정리해 보았습니다.
[JAVA] Spring을 이용한 테스트 코드 작성 방법 (단위 테스트, 통합 테스트)
[JAVA] Spring을 이용한 테스트 코드 작성 방법 (단위 테스트, 통합 테스트)
소프트웨어 개발에서 테스트 코드는 단순히 오류를 찾는 도구를 넘어, CI/CD(Continuous Integration/Continuous Deployment) 파이프라인과 개발 생산성 향상에 핵심적인 역할을 합니다.이 글에서는 JPA를 사용
tae-hui.tistory.com
이번 글에서는 해당 내용에 대해 조금 더 깊에 알아보려고 합니다. 특히, Mock 객체와 MockBean의 차이점, 통합테스트에서의 Application Context 초기화
, 그리고 성능 최적화 방법을 자세히 정리했습니다.
1. 🧩 Spring 테스트의 기본: @SpringBootTest
🔍 @SpringBootTest란?
@SpringBootTest
는 Spring Boot 애플리케이션 전체를 초기화하며, 통합 테스트를 위한 환경을 제공합니다. 이 애노테이션을 선언하면 애플리케이션 컨텍스트(Application Context)가 생성되고, 컨텍스트에 등록된 @Service
, @Repository
, @Component
같은 빈들을 사용할 수 있습니다.
🏗️ Application Context 초기화의 특징
- Application Context는 등록된 빈만 사용 가능:
@SpringBootTest
는 애플리케이션 전체 컨텍스트를 초기화하기 때문에, 테스트 대상 클래스에서 등록되지 않은 빈은 사용할 수 없습니다. - 모든 의존성이 반드시 빈이어야 함: 테스트 클래스에서 의존성을 주입받으려면, 해당 의존성이 반드시 Application Context에 등록되어 있어야 합니다.
장점
- 실제 환경과 유사한 테스트 환경 제공: 실제 애플리케이션과 동일한 컨텍스트에서 동작합니다.
- 빈 의존성 테스트 가능: 의존성 주입이나 컨텍스트 설정이 올바른지 확인할 수 있습니다.
단점
- 속도가 상대적으로 느림: 애플리케이션 컨텍스트를 초기화하는 데 시간이 걸리기 때문에, 작은 단위 테스트보다는 통합 테스트에 적합합니다.
사용 예시
@SpringBootTest
public class ExampleServiceTest {
@Autowired
private ExampleService exampleService;
@Test
public void testServiceLogic() {
String result = exampleService.doSomething();
assertEquals("ExpectedValue", result);
}
}
Tip:
@SpringBootTest
는 애플리케이션 전체를 테스트할 때 유용합니다. 하지만 모든 테스트에서 사용하면 속도 문제가 생길 수 있으니 필요한 경우에만 해야합니다.
2. 🛠️ @MockBean: Mock 객체를 Application Context에 등록하기
🔍 @MockBean의 역할
@MockBean
은 Spring의 Mock 객체를 Application Context에 등록하는 방법입니다. 실제 빈 대신 Mock 객체를 주입하여 테스트에 활용할 수 있습니다.
주요 특징
- Mock 객체를 사용하면서도, Spring 컨텍스트와 연동된 테스트를 수행할 수 있습니다.
- Mock 객체의 동작을 정의하여 원하는 시나리오를 검증할 수 있습니다.
사용 예시
@SpringBootTest
public class ExampleServiceTest {
@MockBean
private ExampleRepository exampleRepository;
@Autowired
private ExampleService exampleService;
@Test
public void testMockRepository() {
// Mock 동작 정의
when(exampleRepository.getData()).thenReturn("MockData");
String result = exampleService.processData();
assertEquals("Processed MockData", result);
}
}
장점
- 통합 테스트 가능: Mock 객체를 주입하더라도 실제 컨텍스트를 초기화하여 전반적인 시스템을 테스트할 수 있습니다.
- 테스트 대상의 의존성 대체: 특정 클래스의 테스트에서만 Mock 객체를 사용하고, 나머지는 실제 빈으로 동작합니다.
단점
@SpringBootTest
와 함께 사용되므로 테스트 속도가 느릴 수 있습니다.
3. 🧪 @Mock과 @InjectMocks: Mockito 기반의 단위 테스트
🔍 @Mock과 @InjectMocks란?
@Mock
은 Mock 객체를 생성하고, @InjectMocks
는 해당 Mock 객체를 주입하여 테스트 대상을 초기화합니다. Spring 컨텍스트를 전혀 사용하지 않고 순수하게 Mockito 프레임워크만으로 테스트를 수행합니다.
사용 예시
@RunWith(MockitoJUnitRunner.class)
public class ExampleServiceTest {
@Mock
private ExampleRepository exampleRepository;
@InjectMocks
private ExampleService exampleService;
@Test
public void testUsingMockito() {
// Mock 동작 정의
when(exampleRepository.getData()).thenReturn("MockData");
String result = exampleService.processData();
assertEquals("Processed MockData", result);
}
}
장점
- 빠른 테스트 속도: Spring 컨텍스트를 초기화하지 않아 매우 빠릅니다.
- 간단한 구조: 단위 테스트 작성이 용이하며, 특정 메서드나 클래스의 동작을 독립적으로 검증할 수 있습니다.
단점
- Spring 컨텍스트를 활용하지 않기 때문에, 빈의 의존성이나 설정 검증은 불가능합니다.
4. 🚀 @SpringBootTest vs Mockito 테스트: 언제 사용할까?
🔑 @SpringBootTest를 사용하는 상황
- 통합 테스트가 필요한 경우: 여러 계층(Service, Repository 등)을 함께 테스트해야 할 때.
- 빈 의존성 확인: 의존성 주입 및 설정이 올바른지 확인해야 할 때.
- Spring Boot 애플리케이션 전체 동작 검증: 실제 환경과 유사한 테스트 환경이 필요할 때.
🔑 Mockito 기반 테스트를 사용하는 상황
- 단위 테스트: 특정 메서드나 클래스만 독립적으로 검증해야 할 때.
- 빠른 테스트가 필요한 경우: 컨텍스트 초기화 없이 간단히 동작을 확인할 때.
5. 📈 성능 최적화: @SpringBootTest를 사용할 때 주의할 점
@SpringBootTest
를 사용하면 Application Context의 초기화가 일어나기 때문에 속도가 느릴 수 있습니다. 하지만 Spring Boot는 컨텍스트 캐싱을 활용하여 동일한 컨텍스트를 재사용하므로, 설정이 변경되지 않는 한 성능 문제가 심각하지 않습니다.
초기화가 일어나는 경우
- 설정이 다르거나 캐싱 조건을 만족하지 못하는 경우
- 다른 프로파일 사용
@ActiveProfiles
로 지정된 프로파일이 다르면 별도의 Context를 초기화합니다.
- 다른 설정 클래스
@SpringBootTest(classes = ...)
로 지정된 설정이 다르면 매번 초기화합니다.
@DirtiesContext
사용
- 특정 테스트가 Context를 더럽혔다고 표시하면, 이후 테스트는 새로운 Context를 초기화합니다.
성능 최적화 팁
- WebEnvironment 설정: 테스트 환경의 WebEnvironment를
NONE
으로 설정하면 불필요한 서버 초기화를 방지할 수 있습니다. @SpringBootTest(webEnvironment = WebEnvironment.NONE) public class ExampleServiceTest { // Test logic here }
- 테스트 분리: 통합 테스트(
@SpringBootTest
)와 단위 테스트(Mockito 기반)를 명확히 분리하여 필요 이상으로 컨텍스트를 초기화하지 않도록 합니다.
6. 🧾 정리: Mock VS MockBean 비교표
항목 | @MockBean |
@Mock + @InjectMocks |
Spring Context 초기화 여부 | 초기화함 | 초기화하지 않음 |
테스트 속도 | 상대적으로 느림 | 매우 빠름 |
빈 의존성 테스트 | 가능 | 불가능 |
사용 용도 | 통합 테스트 | 단위 테스트 |
핵심 요약
@SpringBootTest
: 애플리케이션 전체 컨텍스트를 초기화하기 때문에, 테스트 대상 클래스에서 등록되지 않은 빈은 사용할 수 없다.@MockBean
: 통합 테스트에서 유용하며, Application Context와 연동된 Mock 객체를 생성합니다.@Mock
: 빠른 단위 테스트에 적합하며, Spring과 독립적으로 동작합니다.
'Java' 카테고리의 다른 글
[JAVA] Spring Boot 대규모 트래픽 처리 #Redis #Scheduler (2) | 2025.01.14 |
---|---|
[JAVA] Spring을 이용한 테스트 코드 작성 방법 (단위 테스트, 통합 테스트) (0) | 2025.01.11 |
[JAVA] ArrayList vs LinkedList 완벽 정리 (0) | 2024.12.31 |
[JAVA] PriorityQueue 설명 및 사용법 (0) | 2024.12.30 |
[JAVA] Queue와 Deque 무엇이 좋을까? (2) | 2024.12.27 |