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
и получить "завернутый" внутри этой двумерной структуры.