首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在TestNG测试用例中使用治理器注入依赖程序?

如何在TestNG测试用例中使用治理器注入依赖程序?
EN

Stack Overflow用户
提问于 2019-11-28 14:59:46
回答 2查看 999关注 0票数 4

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

我之所以选择Google,是因为TestNG提供了内置支持,可以用Guice注入测试对象。我只需要指定我的Guice模块,您可以在下一个代码片段中看到:

代码语言:javascript
复制
    @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。例如:

代码语言:javascript
复制
    Injector injector = LifecycleInjector.builder()
        .withModules(CommModules.class).build().createInjector();

我希望尽可能的透明,就像TestNG做的那样。

我想知道是否:

  • 为了重用Injector注释方法,可以向TestNG提供我自己的@Guice实例吗?
  • 您知道哪些库可以集成治理器和TestNG吗?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-29 17:54:44

直到现在,这是不可能的。我已经在TestNG的最新快照版本中修复了这个问题。它应该可以在即将发布的TestNG版本(任何大于7.0.0的版本)中使用。

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

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

  • 实现接口org.testng.IInjectorFactory
  • 通过命令行参数-dependencyinjectorfactory插件新创建的实现的完全限定类名
票数 3
EN

Stack Overflow用户

发布于 2019-12-03 13:17:13

因为允许用户提供DI注入器 TestNG特性将出现在比7.0.0更大的版本中。我使用TestNG版本的7.0.0侦听器实现了一个解决方案。

首先,我创建了一个名为自动驾驶仪测试转轮的模块,其依赖项如下:

代码语言:javascript
复制
<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也会创建它的注入器,并且声明的依赖项将被创建两次。
  • AutopilotSuiteListenerISuiteListener的实现,用于在套件启动前创建父Injector、治理器的LifecycleManager实例和绑定配置属性。因此,每个套件都将有一个带有治理器和生命周期管理器的父Injector
  • AutopilotTestListener:负责在运行的测试用例中注入依赖项的ITestListener实现。
  • META-INF/services/org.testng.ITestNGListener:包含两个ITestNGListener实现的完全限定名的服务提供者配置文件。

然后,我将autopilot-testng-runner作为maven依赖项添加到项目中。

代码语言:javascript
复制
    <dependency>
        <groupId>com.github.eljaiek.playground</groupId>
        <artifactId>autopilot-testng-runner</artifactId>
        <version>${project.version}</version>
        <scope>test</scope>
    </dependency>

最后,我将@Guice注释替换为@AutopilotTest

代码语言:javascript
复制
    @AutopilotTest(modules = CommModule.class)
    public class CommunicationTest {

        @Inject
        private Communication comms;

        @Test
        public void testSendMessage() {
            Assertions.assertThat(comms.sendMessage("Hello World!")).isTrue();
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59091590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档