junit Sping Boot Test中使用@RecordApplicationEvents对ApplicationEvents的Assert意外失败

nzkunb0c  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(119)

我正在编写一些改进代码,这些代码使用继承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

drkbr07n

drkbr07n1#

经过更多的橡皮鸭编程,以及与同事的聊天,我们发现问题在于我们使用了一个任务执行器。在我们使用的版本中,@RecordApplicationEvents只记录当前线程中发生的事件。所以,我找到了罪魁祸首。
为了正确地回答这个问题,我将使用最新的Sping Boot 3.x(使用Spring Framework 6.x)进行更多的测试,看看它是否解决了我遇到的问题。

相关问题