0

我正在创建一组 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(){
      //
    }

}

我想我必须创建另一个类以将文件名作为字符串数组提供..以便测试类可以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() 声明为静态,这意味着我必须将实例变量 allfiles 设为静态!

我认为这是junit测试中的常见场景..所以有人可以告诉我如何正确地做到这一点吗?

4

1 回答 1

0

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

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

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

public class SomeTests extends FileBasedTests {
  ...
}

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

于 2013-08-30T20:26:24.440 回答