我是TestNG的新手,这是我的问题.. 我需要通过构造函数将数据传递给我的@test方法,我编写了下面的代码,但得到了一个空指针异常,
public class ParameterTests {
String x=null;
int y;
//no-arg constructor
public ParameterTests(){
}
@Factory(dataProvider="MyData")
public ParameterTests(String x, int y ){
this.x=x;
this.y=y;
}
@DataProvider(name = "MyData")
public Object[][] DataSupplier(Method meth) {
Object[][] result = null;
if (meth.getName().equals("Test1")) {
result = new Object[][] {
{"Test1-D1", 1 }, {"Test1-D2", 2 }
};
} else if (meth.getName().equals("Test2")) {
result = new Object[][] {
{ "Test2-D3", 3 },
{ "Test2-D4", 4 }
};
}
return result;
}
@Test//(dataProvider = "MyData")
public void Test1() {
System.out.println(x + " " + y);
}
@Test//(dataProvider = "MyData")
public void Test2() {
System.out.println(x + " " + y);
}
}
我正在接受 java.lang.RuntimeException:java.lang.NullPointerException at org.testng.internal.MethodInvocationHelper.invokeDataProvider(MethodInvocationHelper.java:161)
答案 0 :(得分:3)
我做了一些修改,将其拆分为2个类,更改了构造函数和dataprovider,希望这会有所帮助。
如果您要使用固定数据运行特定测试用例,请为每个测试用例配置不同的数据提供程序。
现在,如果您要为特定数据选择要运行的测试用例,请使用IMethodInterceptor或IAnnotationTransformer或beanshell来确定要运行的测试用例。
package com.crazytests;
import java.lang.reflect.Method;
import org.testng.ITestContext;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;
public class MyFactoryClass {
@DataProvider(name = "MyData")
public static Object[][] dp(ITestContext context, Method m) throws Exception {
return new Object[][] { new Object[] { "Test1-D1", 1 }, new Object[] { "Test1-D2", 2 } };
}
@Factory(dataProvider = "MyData")
public Object[] createInstances(String x, int y) {
return new Object[] { new ParameterTests(x, y) };
}
}
和测试类
package com.crazytests;
import org.testng.annotations.Test;
public class ParameterTests {
private String x;
private int y;
public ParameterTests(String x, int y) {
this.x = x;
this.y = y;
}
@Test
public void tetsCase1() {
System.out.println(this.x + this.y);
}
@Test
public void tetsCase2() {
System.out.println(this.x + this.y);
}
}
答案 1 :(得分:2)
在这种情况下,调用dataprovider的方法不是@Test方法,而是@Factory构造函数。因此,您的meth实例为null,因为它是一个调用dataprovider的构造函数。您可以直接在方法上使用数据提供者。