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

时间:2019-01-09 16:37:14

标签: java spring spring-boot junit junit5

背景

我的目标是在Spring环境中执行JUnit 5测试时收集各种时间戳,以创建不同任务持续时间的统计信息。 (Repository for reference

由于我无法触摸实际的测试代码,因此必须从JUnit Jupiter扩展程序中注册诸如ContextRefreshedEvent之类的回调。目前,我正在these callbacks中注册Spring configuration object,并希望通过测试应用程序中的某些组件扫描可以找到它。正如您可以想象的那样,这并不是在每个测试上下文中都能可靠地工作。

问题

我希望我能以某种方式手动在my first callback method from JUnit中注册这些事件,例如ContextRefreshedEvent。据我了解,这要求我在运行时向当前正在运行的Spring Context添加包含回调的Configuration或Component。

这是否可行,或者您知道我最初的问题的任何其他解决方案吗?非常感谢您对此问题的任何投入,因为我已经花了相当长的时间进行研究。

非常感谢您!

1 个答案:

答案 0 :(得分:2)

更新

Spring Framework 5.2将具有对测试事件的内置支持。有关详细信息,请参见GitHub issue 18490


在Spring #TempTable中引发与测试相关的事件的最佳方法是实现自定义(Spring)ApplicationContext,该自定义事件通过TestExecutionListener API(其中{{1 }}工具。

您可以通过ApplicationEventPublisher在自定义ApplicationContext中的生命周期方法内访问测试的ApplicationContext

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

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

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

此致

Sam( Spring TestContext Framework 的作者)