通常在我的单元测试中,我有从资源文件中读取并存储到测试类的静态属性中的固定装置:
public class TestFoo {
private static String fileContents;
@BeforeClass
public static void setup() throws IOException {
fileContents = ... read TestFoo.class.getResourceAsStream("filename") ...
}
}
哪个有效,但我遇到的问题是我通常不喜欢我的测试中的非最终静态数据,因为它允许一个测试用例影响另一个测试用例的输出(在上面的示例中,如果一个测试重新分配fileContents
给别的东西,那么在使用夹具数据的其他测试中会有副作用)。
如果我添加了 final 修饰符,那么赋值必须在声明时发生,这在初始化非常重要时会出现问题(例如在上面的示例中,初始化代码可能会触发已检查的异常)。另一种方法是使用静态初始化块:
public class TestFoo {
private final static String fileContents;
static {
try {
fileContents = ... read TestFoo.class.getResourceAsStream("filename") ...
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
但由于必须编写 try/catch 的冗长,我并不特别喜欢这种方法。
哪种方法更常见/惯用 Java,还是有更好/更典型的方法来初始化静态最终资源?