构造函数上的TestNG Factory,DataProvider和valargs导致" java.lang.IllegalArgumentException:错误的参数数量" 2

时间:2018-03-22 16:41:19

标签: java testng testng-dataprovider

我正在使用TestNG创建一个测试用例,该测试用例使用DataProvider将数据提供给Factory,该工厂用于测试用例类的构造函数以在类中设置变量。我将我的DataProvider放在一个单独的类中用于模块化(因为我期望我的测试用例数量相当大,我需要重用DataProviders。示例如下所示:

包含DataProvider的类:

public class DP {

    @DataProvider(name="testData")
    public Object[][] testData() {
        return new Object[][] {
            { "tc1", "1" },
            { "tc2", "2" },
            { "tc3", "3" }
        };
    }

}

包含测试用例的类:

public class SampleTestCase {

    String[] params;

    @Factory(dataProviderClass=DP.class, dataProvider="testData")
    public SampleTestCase(String[] params) {
        System.out.println("Constructor...");
        for(String s : params)
            System.out.println(s);

        this.params = params;
    }

    @Test
    public void tc1() {
        System.out.println("tc1...");
        for(String s : params)
            System.out.println(s);
    }

    @Test(dependsOnMethods="tc1")
    public void tc2() {
        System.out.println("tc2...");
        for(String s : params)
            System.out.println(s);
    }
}

当我尝试运行此操作时,出现以下错误:

  

org.testng.TestNGException:工厂方法类   com.company.automation.regression.SampleTestCase.com.company.automation.regression.SampleTestCase()   抛出一个例外   org.testng.internal.FactoryMethod.invoke(FactoryMethod.java:121)at   org.testng.internal.TestNGClassFinder。(TestNGClassFinder.java:153)     在   org.testng.internal.TestNGClassFinder。(TestNGClassFinder.java:40)     在org.testng.TestRunner.initMethods(TestRunner.java:403)at   org.testng.TestRunner.init(TestRunner.java:252)at   org.testng.TestRunner.init(TestRunner.java:222)at   org.testng.TestRunner。(TestRunner.java:171)at   org.testng.remote.support.RemoteTestNG6_10 $ 1.newTestRunner(RemoteTestNG6_10.java:28)     在   org.testng.remote.support.RemoteTestNG6_10 $ DelegatingTestRunnerFactory.newTestRunner(RemoteTestNG6_10.java:61)     在   org.testng.SuiteRunner $ ProxyTestRunnerFactory.newTestRunner(SuiteRunner.java:623)     在org.testng.SuiteRunner.init(SuiteRunner.java:189)at   org.testng.SuiteRunner。(SuiteRunner.java:136)at   org.testng.TestNG.createSuiteRunner(TestNG.java:1375)at at   org.testng.TestNG.createSuiteRunners(TestNG.java:1355)at at   org.testng.TestNG.runSuitesLocally(TestNG.java:1209)at at   org.testng.TestNG.runSuites(TestNG.java:1133)at   org.testng.TestNG.run(TestNG.java:1104)at   org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:114)     在org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)     在org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)引起   by:org.testng.TestNGException:无法实例化类   com.company.automation.regression.SampleTestCase at   org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:40)     at org.testng.internal.FactoryMethod.invoke(FactoryMethod.java:107)     ... 19更多引起:java.lang.IllegalArgumentException:错误   参数的数量   sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)     at sun.reflect.NativeConstructorAccessorImpl.newInstance(未知   来源)at   sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知   来自java.lang.reflect.Constructor.newInstance(未知来源)     在   org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:29)     ......还有20个

如果我将SampleTestCase的构造函数的参数从String[] params更改为String p1, String p2,那么它可以正常工作。我唯一的问题是我的DataProvider中有大量的参数(即10个以上的参数)。我计划将其加载到哈希映射中,一旦我能够正常工作......

提前谢谢!

1 个答案:

答案 0 :(得分:0)

要避免错误,请创建类型为String[]的对象:

public class DP {

    @DataProvider(name="testData")
    public static Object[][] testData() {
        return new Object[][] {
            { new String[] {"tc1", "1" }},
            { new String[] {"tc2", "2" }},
            { new String[] {"tc3", "3" }}
        };
    }

}

Object[][]数组的两个外部维度由TestNG“解包”(第一个维度定义单独的调用,第二个维度定义要传递给测试/工厂方法的单独参数)。要接收数组作为参数,应将其视为任何其他Object并在此二维结构中“包装”。