返回 Object[][] 的 DataProvider 与参数类型不匹配
DataProvider returning Object[][] does not match argument type
我有一个 TestNG dataProvider 需要 return 一个 Object[][]。下面是我如何得到这个对象数组,我正在 returning.
测试方法如下:
public void testUser(UserModel testData)
获取父"Test"方法的参数类型。 (方法 m.getParameterTypes()[0].newInstance)并将其添加到对象数组。 (它将向该数组添加 UserModel 对象类型)- 这很好用。
将此 Object[] 传递到一个方法中,该方法从 json 文件中读取并将其构建到对象类型中。然后此方法 returns 一个基于 json 文件的对象类型的对象数组 (Object[])。 - 这很好用。
从那里我将 Object[] returned 转换为二维对象数组。它看起来像这样:Object[size][1]。 - 它可以很好地构建对象[][],但对象可能会在此处丢失其类型。
例如:数组由两个对象组成。它看起来像这样。
对象[1][1] = 对象[0]
对象[2][1] = 对象[1]
然后我 return 要使用这个对象,它抛出以下异常:
java.lang.IllegalArgumentException: 参数类型不匹配
我已经尝试 return 方法 return 的单个 Object[] 如下:
return new Object[][] { singleObjectArray };
但这只是忽略了测试用例,因为它 return 不正确。
如何确保对象数组 return 类型正确。我只想能够处理来自 json 的对象数组,并多次使用测试用例 运行。
这是 DataProvider 代码。
@DataProvider(name = "DataProviderArray")
protected static Object[][] getCoreDataProviderArray(Method superMethod,
ITestContext context) {
List<Object> objectList = new ArrayList<>();
try {
objectList.add(superMethod.getParameterTypes()[0].newInstance());
Object[] objectArray = objectList.toArray();
JsonUtils jsonUtils = new JsonUtils(TEST_DATA_LOCATION
+ context.getName() + JSON_EXTENSION);
Object[] newUsers = jsonUtils.createArrayOfObjectsFromJsonFile(objectArray);
Object [][] objects = new Object[newUsers.length][1];
for (int i = 0; i < newUsers.length; i++) {
System.arraycopy(newUsers, i, objects[i], 0, 1);
}
return objects;
} catch (Exception e) {
throw new RuntimeInterruptionException("Could not return object for "
+ superMethod.getParameterTypes()[0] + "...");
}
}
和 JsonUtils class:
public Object[] createArrayOfObjectsFromJsonFile(Object[] objectToCreate) {
gson = new GsonBuilder().create();
return gson.fromJson(reader, objectToCreate.getClass());
}
这是堆栈跟踪:
java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:86)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:643)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:820)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1128)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)
at org.testng.TestRunner.privateRun(TestRunner.java:782)
at org.testng.TestRunner.run(TestRunner.java:632)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:366)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:361)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:319)
at org.testng.SuiteRunner.run(SuiteRunner.java:268)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1244)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
at org.testng.TestNG.run(TestNG.java:1064)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:124)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
提前致谢!
您应该尝试类似的方法:
@DataProvider(name = "DataProviderArray")
protected static Iterator<Object[]> getCoreDataProviderArray(Method superMethod, ITestContext context) {
Class<?> type = superMethod.getParameterTypes()[0];
JsonUtils jsonUtils = new JsonUtils(TEST_DATA_LOCATION
+ context.getName() + JSON_EXTENSION);
List<Object> newUsers;
try {
newUsers = jsonUtils.createObjectsFromJsonFile(type);
} catch (Exception e) {
throw new RuntimeInterruptionException("Could not return object for "
+ superMethod.getParameterTypes()[0] + "...");
}
List<Object[]> objects = new ArrayList<>();
for (Object user : newUsers) {
objects.add(new Object[]{user});
}
return objects.iterator();
}
然后,更难的部分将是 JsonUtils,其中包含以下内容:
public List<Object> createObjectsFromJsonFile(Class<?> objectToCreate) {
gson = new GsonBuilder().create();
return gson.fromJson(reader, /*<appropriate type array from objectToCreate>*/);
}
但答案就在这里:Java Type Generic as Argument for GSON
我有一个 TestNG dataProvider 需要 return 一个 Object[][]。下面是我如何得到这个对象数组,我正在 returning.
测试方法如下:
public void testUser(UserModel testData)
获取父"Test"方法的参数类型。 (方法 m.getParameterTypes()[0].newInstance)并将其添加到对象数组。 (它将向该数组添加 UserModel 对象类型)- 这很好用。
将此 Object[] 传递到一个方法中,该方法从 json 文件中读取并将其构建到对象类型中。然后此方法 returns 一个基于 json 文件的对象类型的对象数组 (Object[])。 - 这很好用。
从那里我将 Object[] returned 转换为二维对象数组。它看起来像这样:Object[size][1]。 - 它可以很好地构建对象[][],但对象可能会在此处丢失其类型。
例如:数组由两个对象组成。它看起来像这样。 对象[1][1] = 对象[0] 对象[2][1] = 对象[1]
然后我 return 要使用这个对象,它抛出以下异常:
java.lang.IllegalArgumentException: 参数类型不匹配
我已经尝试 return 方法 return 的单个 Object[] 如下:
return new Object[][] { singleObjectArray };
但这只是忽略了测试用例,因为它 return 不正确。
如何确保对象数组 return 类型正确。我只想能够处理来自 json 的对象数组,并多次使用测试用例 运行。
这是 DataProvider 代码。
@DataProvider(name = "DataProviderArray")
protected static Object[][] getCoreDataProviderArray(Method superMethod,
ITestContext context) {
List<Object> objectList = new ArrayList<>();
try {
objectList.add(superMethod.getParameterTypes()[0].newInstance());
Object[] objectArray = objectList.toArray();
JsonUtils jsonUtils = new JsonUtils(TEST_DATA_LOCATION
+ context.getName() + JSON_EXTENSION);
Object[] newUsers = jsonUtils.createArrayOfObjectsFromJsonFile(objectArray);
Object [][] objects = new Object[newUsers.length][1];
for (int i = 0; i < newUsers.length; i++) {
System.arraycopy(newUsers, i, objects[i], 0, 1);
}
return objects;
} catch (Exception e) {
throw new RuntimeInterruptionException("Could not return object for "
+ superMethod.getParameterTypes()[0] + "...");
}
}
和 JsonUtils class:
public Object[] createArrayOfObjectsFromJsonFile(Object[] objectToCreate) {
gson = new GsonBuilder().create();
return gson.fromJson(reader, objectToCreate.getClass());
}
这是堆栈跟踪:
java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:86)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:643)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:820)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1128)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)
at org.testng.TestRunner.privateRun(TestRunner.java:782)
at org.testng.TestRunner.run(TestRunner.java:632)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:366)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:361)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:319)
at org.testng.SuiteRunner.run(SuiteRunner.java:268)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1244)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
at org.testng.TestNG.run(TestNG.java:1064)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:124)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
提前致谢!
您应该尝试类似的方法:
@DataProvider(name = "DataProviderArray")
protected static Iterator<Object[]> getCoreDataProviderArray(Method superMethod, ITestContext context) {
Class<?> type = superMethod.getParameterTypes()[0];
JsonUtils jsonUtils = new JsonUtils(TEST_DATA_LOCATION
+ context.getName() + JSON_EXTENSION);
List<Object> newUsers;
try {
newUsers = jsonUtils.createObjectsFromJsonFile(type);
} catch (Exception e) {
throw new RuntimeInterruptionException("Could not return object for "
+ superMethod.getParameterTypes()[0] + "...");
}
List<Object[]> objects = new ArrayList<>();
for (Object user : newUsers) {
objects.add(new Object[]{user});
}
return objects.iterator();
}
然后,更难的部分将是 JsonUtils,其中包含以下内容:
public List<Object> createObjectsFromJsonFile(Class<?> objectToCreate) {
gson = new GsonBuilder().create();
return gson.fromJson(reader, /*<appropriate type array from objectToCreate>*/);
}
但答案就在这里:Java Type Generic as Argument for GSON