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

Posted

技术标签:

【中文标题】构造函数上的 TestNG Factory、DataProvider 和 valargs 导致“java.lang.IllegalArgumentException:参数数量错误”2【英文标题】:TestNG Factory, DataProvider, and valargs on constructor is causing "java.lang.IllegalArgumentException: wrong number of arguments"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 多个参数)。一旦我可以正常工作,我计划将它们加载到哈希映射中......

提前谢谢你!

【问题讨论】:

【参考方案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 并被“包裹”在这个二维结构中。

【讨论】:

以上是关于构造函数上的 TestNG Factory、DataProvider 和 valargs 导致“java.lang.IllegalArgumentException:参数数量错误”2的主要内容,如果未能解决你的问题,请参考以下文章

TestNG中@Factory的用法一:简单的数据驱动

TestNG+Factory,自定义方法的执行顺序

javascript工厂函数(factory function)vs构造函数(constructor function)

org.springframework.beans.factory.BeanCreationException:创建名为“”的bean时出错:通过构造函数进行bean实例化失败;

TestNg的工厂測试引用@DataProvider数据源----灵活使用工厂測试

Java hashset构造函数内联[重复]