如何在多个junit4测试类中初始化公共资源名称

时间:2013-08-30 14:46:10

标签: java junit4

我正在创建一组junit测试类,所有这些类都从相同的输入数据文件中读取。我创建了一个测试套件,如下所示,但发现我将复制每个测试类中的文件名。

那么,如何在不重复代码的情况下执行此操作..

@RunWith(Suite.class)
@SuiteClasses({SomeTests.class,someOtherTests.class})
public class AllTests{

}
-------------------
public class SomeTests{
    private String[] allfiles;

    public SomeTests() {
        allfiles = new String[] {"data1.txt","data2.txt"};
    }

    @Test
    public void testXX1(){
      //
    }

    @Test
    public void testXX2(){
      //
    }

}

public class someOtherTests{
    private String[] allfiles;

    public someOtherTests() {
        allfiles = new String[] {"data1.txt","data2.txt"};
    }

    @Test
    public void testYY(){
      //
    }

}

我认为我必须创建另一个类来提供文件名作为String数组。测试类可以通过调用allfiles静态方法初始化getFileNames()变量,将此与BeforeClass注释

public class FileNames {
    public static String[] getFileNames() {
        return new String[]{"data1.txt","data2.txt"};
    }
}

public class SomeTests{
    private String[] allfiles;

    public SomeTests() {

    }

    @BeforeClass
    public void setUp(){
       allfiles = FileNames.getFileNames();
    }

    @Test
    public void testXX1(){
      //
    }

    @Test
    public void testXX2(){
      //
    }

}

但我不确定这是正确的方法。这将要求setUp()声明为static,这意味着我必须使实例变量allfiles为static!

我认为这是junit测试的常见情况。那么有人可以告诉我如何正确地做到这一点吗?

1 个答案:

答案 0 :(得分:0)

使用@Before代替@BeforeClass,然后您的setUp()方法不必是静态的。

但是,除非您要在测试中修改文件名数组,否则还可以为测试创建基类并使用这些名称声明受保护的常量:

public class FileBasedTests {
  protected static final String[] FILENAMES = {"data1.txt","data2.txt"}
}

public class SomeTests extends FileBasedTests {
  ...
}

如果你真的担心每个测试都有自己的文件名副本,你可以写allFiles = FILENAMES.clone()