Аргументы переменной длины в методе TestNG

Я пишу тесты в 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)

Может ли кто-нибудь сказать мне, почему появляется эта ошибка и как я могу решить эту проблему?


person Vaibhav Agarwal    schedule 25.02.2014    source источник
comment
В моем случае помогло изменение Object[][] -> String[][]. Это в основном то же самое, что предложил @Anuragh27crony, но избавляет вас от необходимости постоянно вводить «новую строку []».   -  person Kirill Gamazkov    schedule 28.01.2016


Ответы (3)


Пожалуйста, попробуйте использовать правильную инициализацию массива, и это должно сработать. Я попробовал тот же код только с правильной инициализацией массива, и это сработало.

@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... введите здесь описание изображения

Надеюсь это поможет

person Anuragh27crony    schedule 25.02.2014
comment
Это действительно рабочий способ решения проблемы, когда метод тестирования имеет только один параметр, и этот параметр имеет значение vararg. - person Oleg Estekhin; 25.02.2014

Текущий 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 as 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 ) {
}
person Oleg Estekhin    schedule 25.02.2014
comment
Спасибо, но проблема в другом - передача аргументов переменной длины в тесте. Я также изменил вопрос для того же самого. - person Vaibhav Agarwal; 25.02.2014
comment
Явные параметры на основе массива также не помогают - person Vaibhav Agarwal; 25.02.2014
comment
Явные параметры на основе массива, показанные в моем ответе, работают. - person Oleg Estekhin; 25.02.2014

Другой способ - установить ваши varagrs как тип объекта и привести к типу String в @Test.

@Test(dataProvider = "testData")
public void test(Object... args) {
    String data0=(String) args[0];
}

Надеюсь, это поможет!

person Huy Hóm Hỉnh    schedule 04.04.2016