如何使用TestInstanceFactory管理实例的生命周期?

时间:2018-08-31 05:19:41

标签: junit5 junit5-extension-model

我正在使用JUnit 5.3.0-RC1,试图为新的TestInstanceFactory接口实现扩展。 (我想从Weld获取对象以进行CDI注入等)

如果实现TestInstanceFactory,则可以创建自己的实例。如果我还实现了AfterEachCallback,则可以在每次测试后清理它们(关闭Weld)。到目前为止,一切都很好。

但是:为此,我必须假设TestInstance.LifeCycle.PER_METHOD。如果测试类使用TestInstance.Lifecycle.PER_CLASS,我将不得不检测到它并等到AfterAllCallback销毁Weld。但是ExtensionContext.getTestInstanceLifecycle被声明为Optional,因此我可能无法确定哪个生命周期处于活动状态。

有没有一种方法让JUnit告诉我何时销毁实例?拥有TestInstanceDestructor之类的扩展名会很好,只要JUnit使用完测试实例就可以调用该扩展名。

第二,AfterEachCallback测试从未调用过@Disabled,这意味着我无法清理通过我的TestInstanceFactory创建的实例。启动Weld有点昂贵,因此理想情况下,无论如何我都会跳过针对禁用测试的工作。有什么方法可以告诉我正在为禁用测试创建哪些实例?

1 个答案:

答案 0 :(得分:1)

  

但是ExtensionContext.getTestInstanceLifecycle被声明为Optional,因此我可能无法确定哪个Lifecycle是活动的。

JUnit 5 Issue Tracker中所述,您可以可靠地检测到哪个Lifecycle模式处于活动状态。

  

有没有办法让JUnit告诉我何时销毁实例?

您先前基于当前AfterEachCallback实现AfterAllCallbackLifecycle的提案就足够了。

但是请记住,如果要在 current 上下文关闭后清除某些内容,可以始终将CloseableResource存储在ExtensionContext.Store中。如果您的扩展程序当前正在方法级别执行,您还可以选择将此类对象存储在 parent Store中。

  

我是否可以通过某种方式确定正在为禁用测试创建哪些实例?

不,我认为不可能。 TestInstanceFactory永远不知道将要执行的方法,因为在类级别调用了TestInstanceFactory