返回Object [] []的DataProvider与参数类型

时间:2016-10-13 14:22:08

标签: java multidimensional-array data-structures testng testng-dataprovider

我有一个需要返回Object [] []的TestNG dataProvider。这是我如何得到这个返回的对象数组。

测试方法如下:

public void testUser(UserModel testData)
  1. 获取父“Test”方法的参数类型。 (方法m.getParameterTypes()[0] .newInstance)并将其添加到Object数组中。 (它会将UserModel对象类型添加到该数组中) - 这样可以正常工作。

  2. 将此Object []传递给从json文件读取并将其构建为对象类型的方法。然后,此方法根据json文件返回该对象类型的对象数组(Object [])。 - 这很好。

  3. 从那里我将Object []转换为2D对象数组。它看起来像这样:Object [size] [1]。 - 它构建了对象[] [],但对象可能在这里丢失了类型。

  4. 例如:数组由两个对象组成。它看起来像这样。 对象[1] [1] =对象[0] 对象[2] [1] =对象[1]

    1. 然后我返回要使用的对象,并抛出以下异常:

      java.lang.IllegalArgumentException:参数类型不匹配

    2. 我试图返回该方法返回的单个Object [],如下所示:

      return new Object[][] { singleObjectArray };
      

      但这只是忽略了测试用例,因为它没有正确地返回它。

      如何确保对象数组返回正确的类型。我只是希望能够处理来自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类:

          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)
      

      提前致谢!

1 个答案:

答案 0 :(得分:0)

你应该尝试类似的东西:

APP_ENV=local
APP_DEBUG=true
APP_URL=project.dev

DB_HOST=localhost
DB_DATABASE=mydb
DB_USERNAME=root
DB_PASSWORD=

然后,更难的部分将是JsonUtils,例如:

@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();
}

但答案就在这里:Java Type Generic as Argument for GSON