我正在研究一个使用 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
注释方法?您可以在here中找到我到目前为止所做的事情。
答案 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
。
AutopilotTestListener:Injector
实现负责在运行的测试用例中注入依赖项。
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