有一个异常 使用 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")}
};
}