TestNG нестатический метод поставщика данных не работает


У меня есть тестовый класс и тестовый метод. Это зависит от метода поставщика данных. Метод поставщика данных находится в другом классе, отличном от тестового класса или одного из его базовых классов. Согласно документации TestNG

Если вы хотите поместить поставщика данных в другой класс, это должен быть статический метод или класс с конструктором без arg, и вы указываете класс, в котором он может быть найден в атрибуте dataProviderClass

Тест класс:

package test;

import org.testng.Assert;
import org.testng.annotations.Test;

import dataprovider.TestDataProvider;

public class TestClass {
      @Test(dataProvider = "get", dataProviderClass=TestDataProvider.class)
      public void test1(String s1, String s2) {
          Assert.assertEquals(s1.length(), s2.length());
      }
}

Класс поставщика данных:

package dataprovider;

import org.testng.annotations.DataProvider;

public class TestDataProvider {
    @DataProvider(name = "get")
    public Object[][] testData() {
        return new Object[][] {{"a", "b"},{"c", "d"}};
    }
}

Тестовый вывод из Eclipse:

    java.lang.RuntimeException: Can't invoke method public java.lang.Object[][] dataprovider.
TestDataProvider.testData() on this instance of class test.TestClass due to class mismatch
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:75)
    at org.testng.internal.MethodInvocationHelper.invokeDataProvider(MethodInvocationHelper.java:137)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:430)
    at org.testng.internal.Invoker.handleParameters(Invoker.java:1243)
    at org.testng.internal.Invoker.createParameters(Invoker.java:992)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1082)
    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:778)
    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:1225)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1150)
    at org.testng.TestNG.runSuites(TestNG.java:1075)
    at org.testng.TestNG.run(TestNG.java:1047)
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:126)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:137)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:58)

Похоже, это не работает. Я использую TestNG 6.9.11 и пробовал работать как с maven, так и с eclipse. Я использую последний плагин Eclipse-TestNG.

2 2

2 ответа:

Отказ от ответственности: я тот, ктодобавил поддержку нестатических методов из внешнего dataProvider .

Просто добавьте @Guice в свой класс:

@Guice
public class TestClass {
    @Test(dataProvider = "get", dataProviderClass=TestDataProvider.class)
    public void test1(String s1, String s2) {
        Assert.assertEquals(s1.length(), s2.length());
    }
}

Это еще не упомянутый вопрос.

Вы уже ответили на свой вопрос, что,

Если вы хотите поместить поставщика данных в другой класс, ему необходимо быть статическим методом или классом с конструктором, не являющимся arg.

И в соответствии с Java-дизайном он не должен работать, вызывать метод из другого класса либо этот метод должен быть статическим, либо нам нужен объект этого класса.

testData метод не статичен, поэтому он не может быть вызван с помощью класса, и вы не создаете конструктор без arg, поэтому не возможность создания объекта (без объекта не может быть вызван нестатический метод).

Надеюсь, вы понимаете мою точку зрения и получите свой ответ:)