将参数传递给 dataProvision 使用@Factory TestNG



有一个异常 使用 TestNG 的@Factory和@dataProvider注释,无法传递调用测试名称,这在构建通用测试作为框架以每次(从 Excel (提供不同数据时需要。在数据提供程序中使用方法 getName(( 会导致运行时异常。getName(( 函数仅在使用 @dataprovider 时工作。但是,与@Factory相结合,会发生异常。有没有办法解决或绕过这个问题?

package Tests;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.testng.ITestContext;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public abstract class GenericFactory11 {
    protected  List<String> data;

    public GenericFactory11(List<String> data) {
        this.data = data;
    }
    @DataProvider(name = "getDataForInstances")
    public static Object[][] getDataForInstances(ITestContext context,Method m){
        System.out.println(context.getName());
        System.out.println(m.getName()); // THIS Line Causes the exception
        return new Object[][]{
                {Collections.singletonList("Java")},
                {Arrays.asList("TestNG", "JUnit")},
                {Arrays.asList("Maven", "Gradle", "Ant")}
        };
    }
}

package Tests;
import static org.testng.Assert.assertNotEquals;
import java.util.List;
import org.testng.annotations.Factory;
import org.testng.annotations.Test;
public class Sanity11 extends GenericFactory11 {
      @Factory (dataProvider = "getDataForInstances")
      public Sanity11(List<String> data) {
            super(data);
        }
    @Test
      public void Sanity(){
        String text = this.data.get(this.data.size()-1);
         System.out.println("Printing Parameters when running test method [" + text + "]");
          assertNotEquals(text,"");
      }
}

运行代码时会收到以下错误:

java.lang.RuntimeException: java.lang.NullPointerException at org.testng.internal.MethodInvocationHelper.invokeMethodNoCheckedException(MethodInvocationHelper.java:49(

您看到的是NullPointerException,因为数据提供程序声明它将接受java.lang.reflect.Method对象,但在本例中,调用方法是java.lang.reflect.Constructor而不是Method对象。

您应该将java.lang.reflect.Method替换为 org.testng.ITestNGMethod

修改后的数据提供程序如下所示:

@DataProvider(name = "getDataForInstances")
public static Object[][] getDataForInstances(ITestContext context, ITestNGMethod method) {
    System.out.println("test name = " + context.getName());
    System.out.println("Method name = " + method.getConstructorOrMethod().getName() + "()n");
    return new Object[][] {
      {Collections.singletonList("Java")},
      {Arrays.asList("TestNG", "JUnit")},
      {Arrays.asList("Maven", "Gradle", "Ant")}
    };
}

最新更新