TestNG Factory, DataProvider и valargs на конструкторе вызывают "java.lang.IllegalArgumentException: неверное количество аргументов"2

Я использую TestNG для создания тестового примера, который использует DataProvider для подачи данных на фабрику, которая используется в конструкторе для класса тестового набора для установки переменных в классе. Я поместил свой DataProvider в отдельный класс для модульности (поскольку я ожидаю, что мое число тестов станет достаточно большим, и мне нужно будет повторно использовать DataProviders. Пример показан ниже:

Класс, содержащий DataProvider:

public class DP {

    @DataProvider(name="testData")
    public Object[][] testData() {
        return new Object[][] {
            { "tc1", "1" },
            { "tc2", "2" },
            { "tc3", "3" }
        };
    }

}

Класс, содержащий тестовые случаи:

public class SampleTestCase {

    String[] params;

    @Factory(dataProviderClass=DP.class, dataProvider="testData")
    public SampleTestCase(String[] params) {
        System.out.println("Constructor...");
        for(String s : params)
            System.out.println(s);

        this.params = params;
    }

    @Test
    public void tc1() {
        System.out.println("tc1...");
        for(String s : params)
            System.out.println(s);
    }

    @Test(dependsOnMethods="tc1")
    public void tc2() {
        System.out.println("tc2...");
        for(String s : params)
            System.out.println(s);
    }
}

Когда я пытаюсь запустить это, я получаю следующие ошибки:

org.testng.TestNGException: класс метода фабрики com.company.automation.regression.SampleTestCase.com.company.automation.regression.SampleTestCase() вызвал исключение в org.testng.internal.FactoryMethod.invoke(FactoryMethod.java:121) в org.testng.internal.TestNGClassFinder.(TestNGClassFinder.java:153) в org.testng.internal.TestNGClassFinder.(TestNGClassFinder.java:40) в org.testng.TestRunner.initMethods(TestRunner.java:403 at).testng.TestRunner.init(TestRunner.java:252) в org.testng.TestRunner.init(TestRunner.java:222) в org.testng.TestRunner.(TestRunner.java:171) в org.testng.remote.support.RemoteTestNG6_10$1.newTestRunner(RemoteTestNG6_10.java:28) в org.testng.remote.support.RemoteTestNG6_10$DelegatingTestRunnerFactory.newTestRunner(RemoteTestNG6_est.jer.jpg).jpg в org.testng.SuiteRunner.init(SuiteRunner.java:189) в org.testng.SuiteRunner.(SuiteRunner.java:136) в org.testng.TestNG.createSuiteRunner(TestNG.java:1375) в org.testng.TestNG.createSuiteRunners(TestNG.java:1355) в org.testng.TestNG.runSuitesLocally(TestNG.java:1209) в org.testng.TestNuG Test:1133) в org.testng.TestNG.run(TestNG.java:1104) в org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:114) в org.testng.remote.RemoteTestNG.initAndRun(RemoteT:251) at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77) Причина: org.testng.TestNGException: Невозможно создать экземпляр класса com.company.automation.regression.SampleTestCase в org.testng.internal.ObjectFactoryIstln. (ObjectFactoryImpl.java:40) at org.testng.internal.FactoryMethod.invoke(FactoryMethod.java:107) ... еще 19 причин: java.lang.IllegalArgumentException: неверное количество аргументов в sun.reflect.NativeConstructorAccessorImpl.nIn (Собственный метод) в sun.reflect.NativeConstructorAccessorImpl.newInstance(неизвестный источник) в sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unk Источник nown) в java.lang.reflect.Constructor.newInstance(неизвестный источник) в org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:29) ... еще 20

Если я изменю параметры конструктора SampleTestCase от String[] params в String p1, String p2, тогда это работает правильно. Моя единственная проблема в том, что у меня будет большой набор параметров в моем DataProvider (то есть 10+ параметров). Я планирую загрузить их в хэш-карту, как только я смогу заставить это работать...

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

1 ответ

Чтобы избежать ошибки, создайте объект типа String[]:

public class DP {

    @DataProvider(name="testData")
    public static Object[][] testData() {
        return new Object[][] {
            { new String[] {"tc1", "1" }},
            { new String[] {"tc2", "2" }},
            { new String[] {"tc3", "3" }}
        };
    }

}

Два внешних измерения Object[][] TestNG "распаковывает" массив (первое измерение определяет отдельные вызовы, второе измерение определяет отдельные аргументы, передаваемые методу test/factory). Чтобы получить массив в качестве аргумента, он должен рассматриваться как любой другой Object и получить "завернутый" внутри этой двумерной структуры.

Другие вопросы по тегам