背景:
我的目标是在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。
这是否可行,或者您知道我最初的问题的任何其他解决方案吗?非常感谢您对此问题的任何投入,因为我已经花了相当长的时间进行研究。
非常感谢您!
答案 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 的作者)