【问题标题】:How to use injection in Test NG test listener如何在 Testng 测试监听器中使用注入
【发布时间】:2015-07-18 21:46:10
【问题描述】:

我有一个 Test NG 监听器类,每次测试失败时都会调用它:

public class MyListener implements ITestListener {

@Inject
private MyBean myBean;

@Override
public void onTestFailure(ITestResult result) {
    myBean.logDetails();
    // log certain information about the failure, 
    // using the injected object.
}
}

当测试失败时,方法被调用,这部分工作正常。

问题是对象没有被注入——它只是空的。我已经检查了一切,CDI工作的通常条件都可以。 该类有一个空的构造函数,我不会在任何地方调用 new()。

有没有办法让对象注入?

我看过这个question,但我看不到如何在测试监听器中执行 CDI。 我还尝试将侦听器类注释为 TestNG 测试,并使侦听器成为 guice 工厂类的子类,但没有运气,我对如何做到这一点有点迷茫。 谢谢!

【问题讨论】:

    标签: java dependency-injection testng cdi


    【解决方案1】:

    目前,TestNG 不允许在侦听器中注入(使用 Guice),并且它不提供侦听器创建挂钩(TestNG 在侦听器本身上调用 new)。 https://github.com/cbeust/testng/issues/279

    但是,如果您使用代码运行 TestNG,您可能会向您的注入框架请求一个实例并将其提供给 TestNG。

    【讨论】:

    • 如何从 Pico 获取并注入 ITestListener?
    【解决方案2】:

    在这里使用previously linked github issue 的回复之一(感谢@juherr)TestNG 7.4.0 答案,没有@Inject,但仍然有效。

    要从侦听器中使用烘焙的Guice 依赖注入容器,您需要通过这种方式从套件中获取Injector 的实例:

    @Override
    public void onTestFailure(ITestResult result) {
        final Injector parentInjector = result.getTestContext().getSuite().getParentInjector();
        final YourGuiceModule module = parentInjector.getInstance(YourGuiceModule.class);
        final MyBean myBean = parentInjector.createChildInjector(module).getInstance(MyBean.class);
        
        myBean.logDetails();
    }
    

    为此,您需要确保运行此侦听器的每个测试都有YourGuiceModuleMyBean 应由上述模块提供。
    您的问题的确切答案可能会在版本 7.5.0 中得到解决,但前提是您使用 Guice

    这是我在 Kotlin 中创建的用于提供任何实例的实用方法:

        private fun <T> ISuite.getInstanceOf(clazz: Class<T>): T =
            with(this.parentInjector) {
                getInstance(YourModule::class.java)
                    .let {
                        createChildInjector(it)
                            .getInstance(clazz)
                    }
            }
    

    意见:我更喜欢(并建议)对依赖注入提供的对象进行编译时检查:在另一个解决方案中,我通过使用 dagger 并完全放弃testng 依赖注入提供者。

    【讨论】:

      猜你喜欢
      • 2018-10-06
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 2018-01-24
      • 2015-06-20
      • 1970-01-01
      相关资源
      最近更新 更多