I have some event publishing:
@Autowired private final ApplicationEventPublisher publisher;
...
publisher.publishEvent(new MyApplicationEvent(mySource));
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);
}
}
}