[Spring] 테스트 코드: @SpyBean으로 @EventListener 검증하기

2023. 12. 23. 22:27·Spring/테스트 코드
반응형
 
 

이번에는 스프링 이벤트 리스너의 내부 동작 테스트 코드를 통해 검증해 보자

📌 서론

이벤트 기반 아키텍처로 백엔드 개발을 진행할 때 이벤트 리스너가 호출되면 내부에서 작성했던 코드가 제대로 동작하는지 테스트하는 것은 애플리케이션의 정확성을 보장하는 데 굉장히 중요하다.

특히, 이벤트 리스너가 이벤트를 받아서 내부에서 어떤 처리를 하는지 확인하는 것이 중요하다. 이번 포스트에서는 RecipeCreationEvent 이벤트가 발행될 때 saveIngredientsIntoMongo 메서드의 내부에서 동작하는 메서드를 검증해 보자

저번 포스트에 이어지는 내용이니 보고 오시는 것을 추천합니다.👇🏻👇🏻

 

[Spring] 테스트 코드: @MockBean으로 @EventListener 검증하기

테스트 코드를 통해 스프링 이벤트 리스너의 반응을 검증해 보자 📌 서론 스프링에서 Event-driven 아키텍처로 설계를 했을때 이벤트가 발행되면 리스너가 올바르게 반응하는지 테스트를 통해 검

curiousjinan.tistory.com

 

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] 테스트 코드: @MockBean/@SpyBean 사용방법

테스트 코드에서 @MockBean과 @SpyBean을 사용해서 이벤트 리스너 검증을 해보자 📌 서론 이전 포스트에서 열심히 스프링 이벤트 리스너에 대한 테스트 코드를 작성하고 검증했다. 나는 이 2가지 리

curiousjinan.tistory.com

반응형

'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
'Spring/테스트 코드' 카테고리의 다른 글
  • [Spring] 테스트: @ParameterizedTest 사용방법
  • [Spring] 테스트 코드: @MockBean/@SpyBean 사용방법
  • [Spring] 테스트 코드: @MockBean으로 @EventListener 검증하기
  • [Spring] 통합 테스트와 단위 테스트 비교하기
Stark97
Stark97
소통 및 문의: dig04059@gmail.com (편하게 연락주세요!) 링크드인 소통이나 커피챗도 환영합니다!
  • Stark97
    오늘도 개발중입니다
    Stark97
  • 전체
    오늘
    어제
    • 분류 전체보기 (250)
      • 개발지식 (20)
        • 스레드(Thread) (8)
        • WEB, DB, GIT (3)
        • 디자인패턴 (8)
      • JAVA (21)
      • Spring (88)
        • Spring 기초 지식 (35)
        • Spring 설정 (6)
        • JPA (7)
        • Spring Security (17)
        • Spring에서 Java 활용하기 (8)
        • 테스트 코드 (15)
      • 아키텍처 (6)
      • MSA (15)
      • DDD (12)
      • gRPC (9)
      • Apache Kafka (19)
      • DevOps (23)
        • nGrinder (4)
        • Docker (1)
        • k8s (1)
        • 테라폼(Terraform) (12)
      • AWS (32)
        • ECS, ECR (14)
        • EC2 (2)
        • CodePipeline, CICD (8)
        • SNS, SQS (5)
        • RDS (2)
      • notion&obsidian (3)
      • 채팅 서비스 (1)
      • AI 탐험대 (1)
      • 팀 Pulse (0)
  • 링크

    • notion기록
    • 깃허브
    • 링크드인
  • hELLO· Designed By정상우.v4.10.0
Stark97
[Spring] 테스트 코드: @SpyBean으로 @EventListener 검증하기
상단으로

티스토리툴바