반응형
이번에는 스프링 이벤트 리스너의 내부 동작 테스트 코드를 통해 검증해 보자
📌 서론
이벤트 기반 아키텍처로 백엔드 개발을 진행할 때 이벤트 리스너가 호출되면 내부에서 작성했던 코드가 제대로 동작하는지 테스트하는 것은 애플리케이션의 정확성을 보장하는 데 굉장히 중요하다.
특히, 이벤트 리스너가 이벤트를 받아서 내부에서 어떤 처리를 하는지 확인하는 것이 중요하다. 이번 포스트에서는 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 메서드가 내부에서 수행하는 작업(호출되는 메서드)을 검증하는 것이 목표다. @SpyBean을 사용하여 CreateRecipeUseCase의 실제 인스턴스를 감시한다.
@DisplayName("[통합] RecipeCreate 스프링 이벤트 구독자 테스트")
class RecipeCreateEventListenerTest extends TotalTestSupport {
@Autowired
private ApplicationContext applicationContext;
@SpyBean
private CreateRecipeUseCase createRecipeUseCase;
@Test
@DisplayName("레시피 생성 스프링 이벤트가 발행되면 이벤트 구독자가 동작한다.")
void whenRecipeCreationEventPublished_thenTriggerEventListenerMethods() {
// given
RecipeCreationEvent event = createEvent();
// when
applicationContext.publishEvent(event);
// then
Mockito.verify(createRecipeUseCase).saveIngredientsIntoMongo();
}
}
3. 테스트코드 분석
준비 단계 (given
)
- RecipeCreationEvent 이벤트를 생성하여 테스트에 사용한다.
실행 단계 (when
)
- applicationContext.publishEvent(event)를 호출하여 스프링 이벤트를 발행한다. 이는 실제 환경에서 이벤트가 발생하는 것과 동일한 효과다.
검증 단계 (then
)
- CreateRecipeUseCase의 saveIngredientsIntoMongo 메서드가 실제로 호출되었는지를 확인한다.
이 테스트 방법은 이벤트 리스너가 RecipeCreationEvent 이벤트에 반응하여 리스너 내부에 작성된 saveIngredientsIntoMongo 메서드를 실제로 호출하는지 간접적으로 확인하는 방법이다. 이는 이벤트 리스너의 내부 로직이 실제로 실행되는지를 검증하는 데 중점을 두며, 이벤트 처리 과정에서 수행되는 실제 작업을 확인한다.
📌 마무리
저번 포스트와 이번 포스트를 통해 스프링 이벤트가 발행되었을 때어떤 식으로 이벤트 리스너 코드를 테스트하는지 알아봤다. 이전 포스트에서는 이벤트가 발행되면 리스너가 동작한다는 것 자체를 검증했고 이번 포스트에서는 호출된 리스너의 내부 동작을 검증했다. 그럼 이 2개 테스트를 합치면 완벽해지는 게 아닐까? 이런 생각에 테스트를 합쳐봤지만 오류가 발생했다.
다음 포스트를 통해 테스트 코드 @MockBean과 @SpyBean을 같이 사용해 보자👇🏻👇🏻
반응형
'Spring 테스트 코드' 카테고리의 다른 글
[Spring] 테스트: @ParameterizedTest 사용방법 (29) | 2023.12.24 |
---|---|
[Spring] 테스트 코드: @MockBean/@SpyBean 사용방법 (66) | 2023.12.24 |
[Spring] 테스트 코드: @MockBean으로 @EventListener 검증하기 (4) | 2023.12.23 |
[Spring] 통합 테스트와 단위 테스트 비교하기 (58) | 2023.12.23 |
주니어 개발자의 테스트 코드 이해하기 (2) | 2023.12.22 |