DataProvider, возвращающий Object [] [], не соответствует типу аргумента

У меня есть DataProvider TestNG, который должен возвращать Object [] []. Вот как я получаю этот объектный массив, который возвращаю.

Методика тестирования выглядит так:

public void testUser(UserModel testData)
  1. Получить тип аргумента родительского метода Test. (Метод m.getParameterTypes () [0] .newInstance) и добавьте его в массив объектов. (Он добавит объектный тип UserModel в этот массив) - Это отлично работает.

  2. Передайте этот Object [] в метод, который читает из файла json и встраивает его в тип объекта. Затем этот метод возвращает массив объектов (Object []) этого типа объекта на основе файла json. - Это нормально работает.

  3. Оттуда я конвертирую Object [], возвращаемый в массив 2D-объектов. Выглядит это так: Объект [размер] [1]. - Он строит объект [] [] нормально, но здесь объекты могут потерять свой тип.

Например: массив состоит из двух объектов. это будет выглядеть так. Объект [1] [1] = Объект [0] Объект [2] [1] = Объект [1]

  1. Затем я возвращаю этот объект для использования, и он вызывает следующее исключение:

    java.lang.IllegalArgumentException: несоответствие типа аргумента

Я попытался вернуть единственный объект 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)

Заранее спасибо!


person dpace    schedule 13.10.2016    source источник
comment
Почему не objects[i][0] = newUsers[i] вместо System.arraycopy(newUsers, i, objects[i], 0, 1);?   -  person juherr    schedule 13.10.2016
comment
Это работает так же. Он по-прежнему не работает с тем же исключением. Не могу понять, почему ...   -  person dpace    schedule 13.10.2016
comment
Вам следует добавить несколько отладочных отпечатков для типов и содержимого. Если вы можете поделиться работоспособным образцом на github, я смогу взглянуть на него   -  person juherr    schedule 13.10.2016
comment
@JulienHerr Спасибо, вот ссылка на проект; github.com/Dominic-Pace/AutoCoreCommons - см. org.autocore.java. commons.utils.BaseCoreTest для класса поставщика данных. - пожалуйста, обратитесь к org.autocore.java.commons.utils.JsonUtils для создания json. - см. тестовый пакет org.autocore.java.unit.commons.utils.JsonUtilsTwo для тестового примера, в котором используется поставщик данных! - пожалуйста, обратитесь к test.resources.testsuites.JsonSuite.xml, чтобы запустить набор ... Имейте в виду, что ссылка на файл json происходит из имени теста в этом файле набора. Спасибо!   -  person dpace    schedule 13.10.2016
comment
Изменить: кажется, что gson.toJson в JsonUtils преобразует указанный тип объекта в LinkedTreeMap и добавляет две карты объектов в массив объектов.   -  person dpace    schedule 14.10.2016
comment
Хорошо, похоже, ты понял. Попробуйте преобразовывать по одному вместо массива. И вы можете использовать прослушиватель / итератор вместо 2d-массива для поставщика данных   -  person juherr    schedule 14.10.2016


Ответы (1)


Вам следует попробовать что-то вроде:

@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 Generic как аргумент для GSON

person juherr    schedule 14.10.2016
comment
Здорово! :) Тогда не могли бы вы принять / проголосовать за ответ? - person juherr; 14.10.2016