我一直在TestNG中编写测试。我的目标是为测试方法提供可变长度参数。我正面临一个对我没有任何意义的问题。代码如下:
@DataProvider(name = "testData")
public static Object[][] testDataProvider() {
return new Object[][] {
{
"hello",
"bye"
}
{
"hey"
}
};
}
@Test(dataProvider = "testData", DataProviderClass = TestData.class)
public void test(String... strings) {
if (strings.length == 1) {
// do something
}
else {
// do something
}
}
此代码为我提供了IllegalArgumentException
。
1 java.lang.IllegalArgumentException: argument type mismatch
2 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
3 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
4 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
5 at java.lang.reflect.Method.invoke(Method.java:606)
6 at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
7 at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
8 at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
9 at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
10 at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
11 at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
12 at org.testng.TestRunner.privateRun(TestRunner.java:767)
13 at org.testng.TestRunner.run(TestRunner.java:617)
14 at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
15 at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
16 at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
17 at org.testng.SuiteRunner.run(SuiteRunner.java:240)
18 at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
19 at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
20 at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
21 at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
22 at org.testng.TestNG.run(TestNG.java:1057)
23 at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
24 at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
25 at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)
有人可以告诉我为什么会出现这个错误,我该如何解决这个问题呢?
答案 0 :(得分:8)
请尝试使用正确的数组初始化,它应该工作。 我只是通过正确的数组初始化尝试了相同的代码并且它有效。
@DataProvider(name = "testData")
public static Object[][] testDataProvider() {
return new Object[][] {
new String[]{ "abc", "abcd" },
new String[]{ "abc", "abcd", "123" }
};
}
@Test(dataProvider = "testData")
public void test(String... str) {
System.out.println("The Length is" + str.length);
}
同时附上TestNG结果......
希望这有帮助
答案 1 :(得分:0)
当前的TestNG 6.8.8每个测试方法不支持多个提供者,从TestNG的角度来看,@ Test的形式的测试声明注释(dataProvider =“testData,testData2”)意味着应该有名为“testData,testData2”的数据提供程序,而不是有两个名为“testData”和“testData2”的提供程序。
之后,TestNG处理vararg方法的方法存在一个错误。有问题的源代码是https://github.com/cbeust/testng/blob/master/src/main/java/org/testng/internal/Invoker.java#L1358,正如您所看到的,TestNG基本上将整个参数数组添加为最后一个参数。有相关的提款请求https://github.com/cbeust/testng/pull/456和https://github.com/cbeust/testng/pull/459。
解决方法:只使用显式的基于数组的参数,例如:
@DataProvider(name = "testData")
public static Object[][] testDataProvider() {
return new Object[][] {
{
new String[]{"a", "b"}
},
};
}
@Test( dataProvider = "testData" )
public void test( String[] strings ) {
}
如果你真的需要verarg测试方法,那么在修复TestNG中的错误之前,你只剩下一个vararg参数,并且使用Object作为vararg基类型:
@DataProvider(name = "testData")
public static Object[][] testDataProvider() {
return new Object[][] {
{
// values of any type that will be wrapped into a single vararg parameter
456, "string", "another string", 456
},
};
}
@Test( dataProvider = "testData" )
// single vararg parameter
public void test( Object... values ) {
}
答案 2 :(得分:0)
另一种方法是将您的varagrs设置为Object-type并在@Test
上强制转换为String类型@Test(dataProvider = "testData")
public void test(Object... args) {
String data0=(String) args[0];
}
希望这有帮助!