TestNG-将参数传递给构造函数,其中参数根据testname决定

时间:2014-10-13 06:42:00

标签: java unit-testing testng

我是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)

2 个答案:

答案 0 :(得分:3)

我做了一些修改,将其拆分为2个类,更改了构造函数和dataprovider,希望这会有所帮助。

如果您要使用固定数据运行特定测试用例,请为每个测试用例配置不同的数据提供程序。

现在,如果您要为特定数据选择要运行的测试用例,请使用IMethodInterceptorIAnnotationTransformerbeanshell来确定要运行的测试用例。

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的构造函数。您可以直接在方法上使用数据提供者。