我正在尝试编写一个从String数组加载不同属性文件的测试。但代码一直抛出一个空指针异常,请问任何想法吗?
@RunWith(value = Parameterized.class)
public class AllTests
{
private static String text;
private static Properties props;
public AllTests(String text)
{
AllTests.text= text;
}
@Parameters
public static List<String[]> data()
{
String[][] data = new String[][] { { "test.properties" }};
return Arrays.asList(data);
}
@BeforeClass
public static void setup()
{
props = new Properties();
try
{
//load a properties file
props.load(new FileInputStream(text));
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
@Test
public void test()
{
System.out.println(text);
}}
我做了一些进一步的调查并发现@Test存根工作但@BeforeClass返回null,我可以不使用设置中的参数吗?
@RunWith(value = Parameterized.class)
public class AllTests
{
private static String client;
public AllTests(String client)
{
AllTests.client = client;
}
@Parameters
public static Collection<Object[]> data()
{
Object[][] data = new Object[][] { { "oxfam.properties" }};
return Arrays.asList(data);
}
@BeforeClass
public static void setup()
{
System.out.println(client);
}
@Test
public void test()
{
System.out.println(client);
}}
答案 0 :(得分:3)
永远不会初始化props
类变量。尝试在声明中初始化它:
private static Properties props = new Properties();
答案 1 :(得分:1)
正如布伦特所说,最初的错误是因为道具没有初始化。但是,测试不起作用的原因是因为您使用的是静态字段。它们应该是实例字段,只有data()
应该是静态的。
以下作品:
@RunWith(value = Parameterized.class)
public class AllTests {
private String text;
private Properties props;
public AllTests(String text) {
this.text = text;
props = new Properties();
try {
// load a properties file
props.load(new FileInputStream(text));
} catch (IOException ex) {
ex.printStackTrace();
}
}
@Parameters
public static List<String[]> data() {
String[][] data = new String[][] { { "test.properties" } };
return Arrays.asList(data);
}
@Test
public void test() {
System.out.println(text);
}
}
JUnit调用data()
方法,然后为AllTests
方法返回的每个值创建data()
类的实例,其构造函数参数也来自{{1} }} 方法。因此,您的文本和道具字段应该是实例字段。
因此,在您的示例中,您的data()
在构造函数之前被调用,因此空指针异常。