背景:
我的目标是在Spring环境中执行JUnit5测试时收集各种时间戳,以创建不同任务持续时间的统计数据。(参考存储库)
因为我无法接触实际的测试代码,所以我必须在我的JUnit Jupiter扩展中注册像ContextRefreshedEvent这样的回调。目前,我正在一个Spring配置对象中注册这些回调,并希望通过测试应用程序中的一些组件扫描可以找到它。正如您可以想象的那样,这并不能可靠地适用于每个测试上下文。
问题:
我希望我能以某种方式在JUnit的第一个回调方法中手动注册这些事件,比如ContextRefreshedEvent。据我所知,这需要我在运行时向当前运行的Spring Context添加一个包含回调的Configuration或Component。
这可能吗?或者你知道我最初问题的其他解决方案吗?我真的很感谢你对这个问题的任何意见,因为我已经为此工作了很长一段时间。
提前非常感谢!
更新:
SpringFramework5.2将内置对测试事件的支持。有关详细信息,请参阅GitHub第18490期。
在SpringApplicationContext
中激发测试相关事件的最佳方式是实现通过ApplicationEventPublisher
API(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的作者)