我正在编写一些改进代码,这些代码使用继承ApplicationEvent的类(例如,UserSubscribedEvent
)。在我的测试中,我想验证@Service
是否执行了预期的逻辑(c.q.订阅处理;推送事件以进行进一步处理)。在我的测试方法中,我没有看到我期望成功的Assert成功。
测试类用@RecordApplicationEvents
注解。通过一些日志行,我已经验证了发布者被调用,并且我看到侦听器处理了该事件。所以代码本身就像预期的那样工作。
@Test
internal fun `validate user subscribed event handling`(applicationEvents: ApplicationEvents) {
assertThat(applicationEvents.stream(UserSubscribedEvent::class.java)).singleElement()
.satisfies({
...
})
}
这个Assert失败,它说没有UserSubscribedEvents
类型的事件。然而,这里的Assert是错误的。我在日志中看到,代理程序已接收到ApplicationEvent并进行了处理。所以我希望这个Assert能成功。
我观察到集成测试运行在线程main
上,而事件处理程序运行在线程executor-1
上。我仍然不确定这是否有区别。
我使用Spring Test 5.3.25。https://docs.spring.io/spring-framework/docs/5.3.25/javadoc-api/org/springframework/test/context/event/ApplicationEvents.html
1条答案
按热度按时间drkbr07n1#
经过更多的橡皮鸭编程,以及与同事的聊天,我们发现问题在于我们使用了一个任务执行器。在我们使用的版本中,@RecordApplicationEvents只记录当前线程中发生的事件。所以,我找到了罪魁祸首。
为了正确地回答这个问题,我将使用最新的Sping Boot 3.x(使用Spring Framework 6.x)进行更多的测试,看看它是否解决了我遇到的问题。