我正在创建一组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测试的常见情况。那么有人可以告诉我如何正确地做到这一点吗?
答案 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()
。