반응형
테스트 코드를 통해 스프링 이벤트 리스너의 반응을 검증해 보자
📌 서론
스프링에서 Event-driven 아키텍처로 설계를 했을때 이벤트가 발행되면 리스너가 올바르게 반응하는지 테스트를 통해 검증하는 것은 매우 중요한 과정이라고 생각한다. 이번 포스트에서는 레시피를 생성하면서 스프링 이벤트(RecipeCreationEvent)를 발행했을 때 이 이벤트를 구독하고 있는 saveIngredientsIntoMongo 메서드가 제대로 호출되어 동작하는지 검증하는 테스트 코드를 작성하는 방법을 알아보자
1. 스프링 이벤트 리스너 코드 이해하기
아래의 코드는 설명을 이해하기 위해 알아야 할 SpringEventListener 클래스다.
@Slf4j
@Component
@RequiredArgsConstructor
public class RecipeCreateEventListener {
private final CreateRecipeUseCase createRecipeUseCase;
@EventListener
public void saveIngredientsIntoMongo(RecipeCreationEvent event) {
createRecipeUseCase.saveIngredientsIntoMongo();
log.info("saveIngredientsIntoMongo method is called");
}
}
2. 테스트 코드 작성하기
테스트의 목표
- 스프링에서 RecipeCreationEvent라는 이벤트가 발행되면 이 이벤트의 구독자 메서드인 saveIngredientsIntoMongo(이벤트 리스너)가 반응하는지 검증하는 것이 이번 테스트를 작성하는 목표다.
사용한 도구
- @MockBean을 사용하여 RecipeCreateEventListener의 가짜 인스턴스를 생성한다.
테스트 코드 작성
@DisplayName("[통합] RecipeCreate 스프링 이벤트 구독자 테스트")
class RecipeCreateEventListenerTest extends TotalTestSupport {
@Autowired
private ApplicationContext applicationContext;
@MockBean
private RecipeCreateEventListener recipeCreateEventListener;
@Test
@DisplayName("레시피 생성 스프링 이벤트가 발행되면 이벤트 구독자가 동작한다.")
void whenRecipeCreationEventPublished_thenTriggerEventListenerMethods() {
// given
RecipeCreationEvent event = new RecipeCreationEvent("재료", "해시태그");
// when
applicationContext.publishEvent(event);
// then
Mockito.verify(recipeCreateEventListener).saveIngredientsIntoMongo(event);
}
}
3. 테스트 코드 분석
준비 단계 (given
)
- RecipeCreationEvent 인스턴스를 생성한다. 이 인스턴스는 테스트 중에 이벤트로 사용된다.
실행 단계 (when
)
- applicationContext.publishEvent(event)를 호출하여 이벤트를 발행한다. 이는 마치 실제 애플리케이션 환경에서 이벤트가 발생하는 것과 같다.
검증 단계 (then
)
- Mockito의 verify 메서드를 사용하여 RecipeCreateEventListener의 saveIngredientsIntoMongo 메서드가 호출되었는지 확인한다.
📌 마무리
이 테스트는 RecipeCreationEvent 이벤트가 발행됐을 때 이벤트 리스너인 saveIngredientsIntoMongo 메서드가 실제로 호출되는지 직접적으로 확인한다. 이렇게 테스트 코드를 통해 이벤트 리스너가 잘 동작하는지 검증하는 것은 굉장히 중요하다.
이렇게 테스트 코드를 작성하면 이벤트 리스너의 외부 동작(호출받아서 메서드가 실행됨)에 중점을 두며, 이벤트 리스너 내부의 처리 로직의 실행까지는 검증하지 않는다. 그래서 이벤트 리스너의 내부 로직이 아닌 이벤트 처리 자체가 잘 이루어지는지 확인하고자 할 때는 이런 식으로 테스트 코드를 작성하면 된다.
@EventListener 내부에서 동작하는 로직(메서드)을 @SpyBean을 사용하여 테스트해보자👇🏻👇🏻
반응형
'Spring > 테스트 코드' 카테고리의 다른 글
[Spring] 테스트 코드: @MockBean/@SpyBean 사용방법 (66) | 2023.12.24 |
---|---|
[Spring] 테스트 코드: @SpyBean으로 @EventListener 검증하기 (40) | 2023.12.23 |
[Spring] 통합 테스트와 단위 테스트 비교하기 (58) | 2023.12.23 |
주니어 개발자의 테스트 코드 이해하기 (2) | 2023.12.22 |
[스프링, 스프링 부트] Spring test - when()에서 발생한 에러 (0) | 2023.08.22 |