参数化JUnit:从String数组中加载多个属性文件

时间:2013-05-22 14:57:14

标签: java properties junit parameterized-unit-test

我正在尝试编写一个从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); }}

2 个答案:

答案 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()在构造函数之前被调用,因此空指针异常。