TestContext 프레임워크는 ApplicationContext에서 발행된 애플리케이션 이벤트를 기록하여, 테스트 내에서 해당 이벤트에 대한 검증을 수행할 수 있도록 지원한다.
단일 테스트 실행 중 발행된 모든 이벤트는 ApplicationEvents API를 통해 제공되며, 이를 java.util.Stream으로 처리할 수 있다.
테스트에서 ApplicationEvents를 사용하려면 다음을 수행한다.
- 테스트 클래스에
@RecordApplicationEvents애노테이션 또는 메타 애노테이션이 적용되어 있는지 확인한다. ApplicationEventsTestExecutionListener가 등록되어 있는지 확인한다. 단,ApplicationEventsTestExecutionListener는 기본적으로 등록되어 있으므로, 기본 리스너를 포함하지 않는@TestExecutionListeners를 통해 커스텀 구성을 사용하는 경우에만 수동 등록이 필요하다.ApplicationEvents타입의 필드에@Autowired애노테이션을 붙이고, 해당 인스턴스를 테스트 및 라이프사이클 메서드(예: JUnit Jupiter의 @BeforeEach, @AfterEach 메서드)에서 사용한다.- JUnit Jupiter에서 SpringExtension을 사용하는 경우, 테스트 메서드나 라이프사이클 메서드의 매개변수로
ApplicationEvents타입을 선언하여, 테스트 클래스 내의@Autowired필드 대신 사용할 수 있다.
다음 테스트 클래스는 JUnit Jupiter용 SpringExtension과 AssertJ를 사용하여, Spring에서 관리되는 컴포넌트의 메서드를 호출하는 동안 발행된 애플리케이션 이벤트 유형을 검증한다.
@SpringJUnitConfig(/* ... */)
@RecordApplicationEvents
class OrderServiceTests {
@Autowired
OrderService orderService;
@Autowired
ApplicationEvents events;
@Test
void submitOrder() {
// 이벤트를 발행하는 OrderService의 메서드 호출
orderService.submitOrder(new Order(/* ... */));
// OrderSubmitted 이벤트가 발행되었는지 확인
long numEvents = events.stream(OrderSubmitted.class).count();
assertThat(numEvents).isEqualTo(1);
}
}
- 테스트 클래스에
@RecordApplicationEvents애노테이션을 추가한다. - 현재 테스트에 대한
ApplicationEvents인스턴스를 주입한다. - ApplicationEvents API를 사용하여 몇 개의
OrderSubmitted이벤트가 발행되었는지 확인한다.
ApplicationEvents API에 대한 자세한 내용은 ApplicationEvents Javadoc을 참조
'스프링' 카테고리의 다른 글
| 트랜잭션이 시작되는 시점 (3) | 2025.08.11 |
|---|---|
| 더티채킹과 지연쓰기 디버깅 (2) | 2025.08.07 |
| Spring Integration Testing 정리 (3) | 2025.08.06 |
| 스프링 transaction의 커밋 (0) | 2025.08.05 |
| 리엑티브 스트림즈에서 Publisher와 Subscriber 정리 (0) | 2025.08.04 |