当前位置: 首页 > 面试题库 >

如何将参数注入TestNG类的构造函数?

燕智
2023-03-14
问题内容

我已经用策略模式实现了一个程序。所以我有一个在某些地方使用的接口,并且可以替换具体的实现。

现在我要测试该程序。我想以类似的方式做。编写一次测试,针对该接口进行测试。应在测试开始时注入具体的接口实现,以便我可以轻松地替换它。

我的测试类看起来与此类似:

public class MyTestClass {

    private StrategeyInterface strategy;

    public MyTestClass(StrategeyInterface strategy) {
        this.strategy = strategy;
    }
    ....test methods using the strategy.
}

在开始测试时,必须使用参数化的构造器来注入具体的策略实施。

现在我没有让TestNG运行它并注入具体的实现实例。我试图与继承几种方法@DataProvider@Factory以及相应的方法,但没有运气。

这是testNG报告的内容:

Can't invoke public void MyClass.myTestMethod(): either make it static or add a no-args constructor to your class

我使用Maven surefire插件来运行测试。这是pom.xml的相关部分:

    <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <suiteXmlFiles>
                    <suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile>
                </suiteXmlFiles>
            </configuration>
        </plugin>
    </plugins>
</build>

我如何编写和运行测试,并将具体实现注入测试类中?

提前致谢。

附言:我可以提供更多我尝试过的代码。我还没有在这里发布它,因为我尝试了很多变体,以至于我现在有点困惑,所有的都失败了。


问题答案:

您有几种选择。如果您使用的是Guice,这是注入实现的一种非常简单的方法。

如果没有,则可以混合使用工厂和数据提供程序:

@Factory(dataProvider = "dp")
public FactoryDataProviderSampleTest(StrategyInterface si) {
}

@DataProvider
static public Object[][] dp() {
  return new Object[][] {
    new Object[] { new Strategy1Impl() },
    new Object[] { new Strategy2Impl() },
  };
}


 类似资料:
  • 通常,我会使用在中启动mock。 我怎样才能做到这一点?到目前为止,我不想在构造函数中注入,因为它会混合业务参数和依赖项。

  • 问题内容: 我有一堂课: 配置文件 我如何将其注入一些构造函数,即: 我希望此字符串具有从Config注入的值。那可能吗? 问题答案: 您将必须命名Bean,然后在自动装配引用该名称时使用注释。 例: 配置文件 SomeC.java

  • 问题内容: 我的spring bean具有一个带有唯一强制性参数的构造函数,我设法用xml配置对其进行了初始化: 然后,我像这样使用此bean,并且效果很好。 但是我想用注释指定contructor arg值,例如 这可能吗 ? 提前致谢 问题答案: 首先,必须在bean定义中而不是在注入点中指定构造函数arg。然后,你可以利用spring的注释(spring 3.0) 就我所看到的问题而言,这可

  • 我刚开始学习抽象类。 我在一些代码测试中遇到了这个抽象的类问题。我已经被对象是如何启动的难倒了。 在抽象类中可以看到,它的构造函数只持有两个参数--和 其中一个要求是创建类。然而,正如在main(由问题提供)中所看到的,对象由启动,其中缺少和seats值。 我试图编写我的货车类,但是,我无法绕过和的参数,而不改变主类中给定的上下文。我试图在谷歌上搜索更多信息,但找不到任何答案。 有人能好心开导我一

  • 我有一个父类,其中包含构造函数注入的依赖项: 如果我从这个类继承,我总是需要重新定义一个调用父构造函数的构造函数吗? 使用 setter 注入,我似乎能够将依赖项保留在父类中,而不需要在子类中重新连接它,如果子类不接触链接到依赖项的功能,这对我来说听起来不错: 看起来,如果我想避免重复自动装配代码和处理子组件中的依赖关系,我只能使用setter或field injection来实现。 是否有更简洁

  • 我想在构造函数中使用Request类,这是我想运行服务器时它给我的错误: 无法自动连接服务"AppBundle\Controller\DetectServiceDetailController":方法"__construct()"引用类"Symfony\Component\HttpFoundation\Request"的参数"$ask",但不存在这样的服务。它不能自动注册,因为它来自不同的根命名空