【问题标题】:How to manage lifecycle of instances with TestInstanceFactory?如何使用 TestInstanceFactory 管理实例的生命周期?
【发布时间】:2018-08-31 05:19:41
【问题描述】:

我正在使用 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 创建的实例。开始焊接有点贵,所以理想情况下,无论如何我都会跳过为禁用测试做这项工作。有什么方法可以告诉我正在为禁用测试创建哪些实例?

【问题讨论】:

    标签: junit5 junit5-extension-model


    【解决方案1】:

    但是ExtensionContext.getTestInstanceLifecycle 被声明为Optional,所以我可能无法分辨出哪个Lifecycle 处于活动状态。

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

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

    您之前基于当前Lifecycle 实施AfterEachCallbackAfterAllCallback 的提议就足够了。

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

    有什么方法可以告诉我正在为禁用测试创建哪些实例?

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

    【讨论】:

    • 谢谢山姆。特别是关于商店的提示。关于禁用测试,如果要实现this feature,它是否涵盖了我想为禁用的测试跳过昂贵的测试实例构建的情况?我可以检查 Method 对象上的 @Disabled 注释,但鉴于其他 ExecutionConditions 我怀疑我不会拥有我需要的一切。听起来对吗?
    • 了解测试方法是否禁用的唯一方法是让框架实际评估所有已注册的ExecutionCondition 扩展。所以我不明白人们怎么能提前知道结果,但也许我忽略了一些东西。
    猜你喜欢
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多