How to test Spring @EventListener method?

前端 未结 3 854
遇见更好的自我
遇见更好的自我 2021-01-11 23:04

I have some event publishing:

@Autowired private final ApplicationEventPublisher publisher;
...
publisher.publishEvent(new MyApplicationEvent(mySource));
         


        
3条回答
  •  情歌与酒
    2021-01-11 23:58

    The option I took was to create a TestConfiguration and a listener within the test itself like this:

    @Slf4j
    @ExtendWith(SpringExtension.class)
    @SpringBootTest(classes = {RegistrationConfiguration.class, RegistrationTestConfiguration.class})
    class RegistrationServiceIntegrationTest {
    
        @Autowired
        private DynamoDBMapper dynamoDBMapper;
        @Autowired
        private AmazonDynamoDBAsync amazonDynamoDB;
        @Autowired
        private RegistrationRepository repository;
        @Autowired
        private ApplicationEventPublisher eventPublisher;
    
        private String personaId;
    
        private RegistrationService testObj = null;
    
        @BeforeEach void setup() {
            RegistrationServiceDBHelper.initializeTable(dynamoDBMapper, amazonDynamoDB, repository);
            personaId = UUID.randomUUID().toString();
            testObj = new RegistrationService(repository, eventPublisher);
        }
    
    
        @TestConfiguration
        static class RegistrationTestConfiguration {
            @Bean
            RegistrationServiceEventListener eventListener() {
                return new RegistrationServiceEventListener();
            }
        }
    
    
        @Component
        public static class RegistrationServiceEventListener {
            @TransactionalEventListener
            public void onPlayerRegisteredEvent(PlayerRegisteredEvent event) {
                log.info("Received new user event {}", event.personaId());
                assertThat(event.personaId()).isNotBlank();
            }
        }
    
    
        @DisplayName("given a persona id that is not registered")
        @Nested class WhenNoPlayerIsRegistered {
    
            @DisplayName("when a player is registered"
                    + " then an event is raised")
            @Test void raisePlayerRegisteredEvent() {
                // When
                testObj.registerPlayer(personaId);
            }
        }
    }
    

提交回复
热议问题