【问题标题】:TestNG Factory, DataProvider, and valargs on constructor is causing "java.lang.IllegalArgumentException: wrong number of arguments"2构造函数上的 TestNG Factory、DataProvider 和 valargs 导致“java.lang.IllegalArgumentException:参数数量错误”2
【发布时间】:2018-03-22 16:41:19
【问题描述】:

我正在使用 TestNG 创建一个测试用例,该测试用例使用 DataProvider 将数据提供给工厂,该工厂用于测试用例类的构造函数以在类中设置变量。我已将我的 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) 在 org.testng.internal.TestNGClassFinder.(TestNGClassFinder.java:153) 在 org.testng.internal.TestNGClassFinder.(TestNGClassFinder.java:40) 在 org.testng.TestRunner.initMethods(TestRunner.java:403) 在 org.testng.TestRunner.init(TestRunner.java:252) 在 org.testng.TestRunner.init(TestRunner.java:222) 在 org.testng.TestRunner.(TestRunner.java:171) 在 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) 在 org.testng.SuiteRunner.(SuiteRunner.java:136) 在 org.testng.TestNG.createSuiteRunner(TestNG.java:1375) 在 org.testng.TestNG.createSuiteRunners(TestNG.java:1355) 在 org.testng.TestNG.runSuitesLocally(TestNG.java:1209) 在 org.testng.TestNG.runSuites(TestNG.java:1133) 在 org.testng.TestNG.run(TestNG.java:1104) 在 org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:114) 在 org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251) 在 org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77) 引起 作者:org.testng.TestNGException:无法实例化类 com.company.automation.regression.SampleTestCase 在 org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:40) 在 org.testng.internal.FactoryMethod.invoke(FactoryMethod.java:107) ... 19 更多原因:java.lang.IllegalArgumentException:错误 参数数量 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(未知 来源)在 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 多个参数)。一旦我可以正常工作,我计划将它们加载到哈希映射中......

提前谢谢你!

【问题讨论】:

    标签: java testng testng-dataprovider


    【解决方案1】:

    为避免该错误,请创建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 并被“包裹”在这个二维结构中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-18
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多