Java 有没有一种优雅的方法可以克服TestNG';依赖注入的缺点是什么?

Java 有没有一种优雅的方法可以克服TestNG';依赖注入的缺点是什么?,java,testng,Java,Testng,根据我的经验,TestNG是最灵活的Java测试框架。然而,它确实存在一些不一致之处。我遇到的主要问题是监听器和方法选择器中缺乏对依赖注入的支持。在编写位于TestNG之上的可重用测试工具时,此功能非常关键。我只能想出两个解决办法(第一个是黑客,第二个是痛苦),所以我想知道是否有人能想出更好的办法 首先,是哈奇的方式 创建表示单例的枚举 package com.example; //other imports public enum Injection { INJECTION pr

根据我的经验,TestNG是最灵活的Java测试框架。然而,它确实存在一些不一致之处。我遇到的主要问题是监听器和方法选择器中缺乏对依赖注入的支持。在编写位于TestNG之上的可重用测试工具时,此功能非常关键。我只能想出两个解决办法(第一个是黑客,第二个是痛苦),所以我想知道是否有人能想出更好的办法


首先,是哈奇的方式

创建表示单例的枚举

package com.example;
//other imports

public enum Injection {
  INJECTION

  private Injector guiceInjector;

  public void setGuiceInjector(final Injector guiceInjector) {
    this.guiceInjector = guiceInjector;
  }

  public void injectInto(final Object obj) {
    Objects.requireNonNull(this.guiceInjector).injectMembers(obj);
  }
}
实现org.testng.IObjectFactory2,如下所示

package com.example;

import static com.example.Injection.INJECTION;
//other imports

public final class GuiceBootstrap implements IObjectFactory2 {
  private final Injector injector;

  public GuiceBootstrap() {
    this.injector = Guice.createInjector(/*modules*/);
    INJECTION.setGuiceInjector(this.injector);
  }

  @Override
  public Object newInstance(final Class<?> kind) {
    return injector.getInstance(kind);
  }
}
一般来说,我鄙视易变状态,所以我不认为这是一种有效的方法。此外,没有任何东西可以阻止使用这种方法的测试工具的用户直接访问枚举(即使它是内部的)。黑的,不干净的,涉及可变状态


第二,痛苦之路

从TestNG中获取控制权,并以编程方式使用它:

package com.example;

public CustomTestNgLauncher {
  public static void main(String... args) {
    final Injector injector = Guice.createInjector(determineGuiceModules(args));
    final ITestObjectFactory guiceObjectFactory = createGuiceObjectFactory(injector);
    final TestNG testNg = new TestNG();
    testNg.setObjectFactory(guiceObjectFactory);
    testNg.setOutputDirectory(reportsDirPathOrNull);
    testNg.setTestSuites(determineTestNgSuites());
    testNg.addListener(injector.getInstance(SomeCustomListener.class));
  }
}
在我看来,这是对第一种方法的改进,但是注入方法选择器的问题仍然存在,因为接受
字符串而不是接受

package com.example;

public CustomTestNgLauncher {
  public static void main(String... args) {
    final Injector injector = Guice.createInjector(determineGuiceModules(args));
    final ITestObjectFactory guiceObjectFactory = createGuiceObjectFactory(injector);
    final TestNG testNg = new TestNG();
    testNg.setObjectFactory(guiceObjectFactory);
    testNg.setOutputDirectory(reportsDirPathOrNull);
    testNg.setTestSuites(determineTestNgSuites());
    testNg.addListener(injector.getInstance(SomeCustomListener.class));
  }
}