Аргументи с променлива дължина в метода 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 като базов тип 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
Изричните параметри, базирани на масиви в from, показани в моя отговор, работят. - person Oleg Estekhin; 25.02.2014

Друг начин е да зададете вашите varagrs като Object-type и да ги прехвърлите към тип 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