如何在运行时为当前测试ApplicationContext注册Spring Context事件



背景

我的目标是在Spring环境中执行JUnit5测试时收集各种时间戳,以创建不同任务持续时间的统计数据。(参考存储库)

因为我无法接触实际的测试代码,所以我必须在我的JUnit Jupiter扩展中注册像ContextRefreshedEvent这样的回调。目前,我正在一个Spring配置对象中注册这些回调,并希望通过测试应用程序中的一些组件扫描可以找到它。正如您可以想象的那样,这并不能可靠地适用于每个测试上下文。

问题

我希望我能以某种方式在JUnit的第一个回调方法中手动注册这些事件,比如ContextRefreshedEvent。据我所知,这需要我在运行时向当前运行的Spring Context添加一个包含回调的Configuration或Component。

这可能吗?或者你知道我最初问题的其他解决方案吗?我真的很感谢你对这个问题的任何意见,因为我已经为此工作了很长一段时间。

提前非常感谢!

更新

SpringFramework5.2将内置对测试事件的支持。有关详细信息,请参阅GitHub第18490期。


在SpringApplicationContext中激发测试相关事件的最佳方式是实现通过ApplicationEventPublisherAPI(ApplicationContext实现)激发事件的自定义(Spring)TestExecutionListener

您可以通过TestContext#getApplicationContext()在自定义TestExecutionListener的生命周期方法中访问测试的ApplicationContext

为了避免接触测试代码,您可以让Spring自动注册您的自定义TestExecutionListener,如下所述:https://docs.spring.io/spring/docs/5.1.4.RELEASE/spring-framework-reference/testing.html#testcontext-tel-config自动发现

然后,您的自定义TestExecutionListener将自动应用于通过Spring TestContext Framework运行的所有测试——除非给定的测试类被配置为覆盖默认侦听器(例如,通过@TestExecutionListeners(...))。

有关相关讨论,请参阅以下春季JIRA问题:

  • https://jira.spring.io/browse/SPR-8710
  • https://jira.spring.io/browse/SPR-13916

问候,

Sam(Spring TestContext Framework的作者)

最新更新