如何在TestNG测试用例中使用Governor注入依赖项?

时间:2019-11-28 14:59:46

标签: java testng guice governator

我正在研究一个使用 TestNG 的测试自动化框架。我决定使用依赖注入模式来实现更具可读性,可重用的页面对象和测试。

由于 TestNG 提供了内置支持,可以使用 Guice模块注入测试对象,因此我选择了 Google Guice 。如下面的代码片段所示,我只需要指定我的 Guice模块

    @Guice(modules = CommModule.class)
    public class CommunicationTest {

        @Inject
        private Communication comms;

        @Test
        public void testSendMessage() {
            Assertions.assertThat(comms.sendMessage("Hello World!")).isTrue();
        }
    }

到目前为止还不错,尽管我将需要更多高级的DI功能,例如:

  • 生命周期管理
  • 配置到字段的映射
  • 通用绑定注释

因此,我想使用Netflix/Governator,因为它通过这些功能增强了 Google Guice 。为了触发 Governator 功能,我必须通过它创建Injector而不是 TestNG 。例如:

    Injector injector = LifecycleInjector.builder()
        .withModules(CommModules.class).build().createInjector();

我想像 TestNG 那样做到尽可能透明。

我想知道是否:

  • 是否可以将我自己的Injector实例提供给 TestNG 以便重用@Guice注释方法?
  • 您知道任何将 Governator TestNG 集成的库吗?

您可以在here中找到我到目前为止所做的事情。

2 个答案:

答案 0 :(得分:2)

到目前为止,这是不可能的。我已经在TestNG的最新快照版本中修复了此问题。它应在即将发布的TestNG版本(任何大于7.0.0的版本)中可用

我为跟踪此问题而创建的问题:https://github.com/cbeust/testng/issues/2199

简而言之,您可以执行以下操作:

  • 实现界面org.testng.IInjectorFactory
  • 通过命令行参数-dependencyinjectorfactory插入新创建的实现的标准类名

答案 1 :(得分:1)

由于Allow user to provide DI Injector TestNG 功能将在大于7.0.0的版本中提供。我使用 TestNG 版本7.0.0侦听器实现了一个解决方案。

首先,我创建了一个名为autopilot-testng-runner的模块,该模块具有以下依赖性:

<dependencies>
   <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
    </dependency>

    <dependency>
        <groupId>com.google.inject</groupId>
        <artifactId>guice</artifactId>
    </dependency>

    <dependency>
        <groupId>com.netflix.governator</groupId>
        <artifactId>governator</artifactId>
    </dependency>

    <dependency>
        <groupId>javax.annotation</groupId>
        <artifactId>javax.annotation-api</artifactId>
    </dependency>

    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
    </dependency>
</dependencies> 

该模块包含下面描述的工件:

  • @AutopilotTest:用于注释必须使用哪些 Guice 模块创建带有Injector的{​​{1}}的自定义注释。由于 TestNG ,我无法重用LifecycleInjector.builder()批注,还将创建其Injector并声明依赖项将创建两次。

  • AutopilotSuiteListener:实现@Guice的过程,用于创建父ISuiteListener Governator的 Injector实例并在Suite启动之前绑定配置属性。因此,每个 Suite 都将有一个由 Governator 和生命周期管理器构建的父级LifecycleManager

  • AutopilotTestListenerInjector实现负责在运行的测试用例中注入依赖项。

  • META-INF/services/org.testng.ITestNGListener:服务提供商配置文件,其中包含两个ITestListener实现的完全限定名称。

然后,我在project

中添加了ITestNGListener作为行家依赖
autopilot-testng-runner

最后,我用 <dependency> <groupId>com.github.eljaiek.playground</groupId> <artifactId>autopilot-testng-runner</artifactId> <version>${project.version}</version> <scope>test</scope> </dependency> 取代了@Guice注释

@AutopilotTest