我正在开发一个使用TestNG的测试自动化框架。为了实现更具可读性、可重用的页面对象和测试,我决定使用依赖注入模式。
我之所以选择Google,是因为TestNG提供了内置支持,可以用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/总督,因为它增强了Google的这些功能。为了触发治理器特性,我必须通过它而不是通过Injector来创建TestNG。例如:
Injector injector = LifecycleInjector.builder()
.withModules(CommModules.class).build().createInjector();我希望尽可能的透明,就像TestNG做的那样。
我想知道是否:
Injector注释方法,可以向TestNG提供我自己的@Guice实例吗?您可以在这里中找到我到目前为止所做的事情。
发布于 2019-11-29 17:54:44
直到现在,这是不可能的。我已经在TestNG的最新快照版本中修复了这个问题。它应该可以在即将发布的TestNG版本(任何大于7.0.0的版本)中使用。
我为跟踪这个问题而创建的问题:https://github.com/cbeust/testng/issues/2199
简而言之,您可以执行以下操作:
org.testng.IInjectorFactory-dependencyinjectorfactory插件新创建的实现的完全限定类名发布于 2019-12-03 13:17:13
因为允许用户提供DI注入器 TestNG特性将出现在比7.0.0更大的版本中。我使用TestNG版本的7.0.0侦听器实现了一个解决方案。
首先,我创建了一个名为自动驾驶仪测试转轮的模块,其依赖项如下:
<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> 这个模块包含下面描述的工件:
LifecycleInjector.builder()创建Injector必须使用哪些Guice模块的自定义注释。我无法重用@Guice注释,因为TestNG也会创建它的注入器,并且声明的依赖项将被创建两次。ISuiteListener的实现,用于在套件启动前创建父Injector、治理器的LifecycleManager实例和绑定配置属性。因此,每个套件都将有一个带有治理器和生命周期管理器的父Injector。ITestListener实现。ITestNGListener实现的完全限定名的服务提供者配置文件。然后,我将autopilot-testng-runner作为maven依赖项添加到项目中。
<dependency>
<groupId>com.github.eljaiek.playground</groupId>
<artifactId>autopilot-testng-runner</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>最后,我将@Guice注释替换为@AutopilotTest。
@AutopilotTest(modules = CommModule.class)
public class CommunicationTest {
@Inject
private Communication comms;
@Test
public void testSendMessage() {
Assertions.assertThat(comms.sendMessage("Hello World!")).isTrue();
}
}https://stackoverflow.com/questions/59091590
复制相似问题