JUnit:静态最终属性的初始化

时间:2013-10-31 20:55:41

标签: java junit static-initialization

通常在我的单元测试中,我有从资源文件中读取并存储到测试类的静态属性中的灯具:

public class TestFoo {

    private static String fileContents;

    @BeforeClass
    public static void setup() throws IOException {
        fileContents = ... read TestFoo.class.getResourceAsStream("filename") ... 
    }   
}

哪个有效,但我遇到的问题是我通常不喜欢我的测试中的非最终静态数据,因为它允许一个测试用例影响另一个测试用例的输出(在上面的例子中如果有的话) test将fileContents重新分配给其他东西,然后在使用fixture数据的其他测试中会产生副作用。)

如果我添加了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,还是有更好/更典型的方法来初始化静态最终资源?

1 个答案:

答案 0 :(得分:1)

我使用@BeforeClass因为它不那么详细。如果您担心某人可能会意外覆盖该值,您也可以使用@Before。除非文件非常大,否则运行时开销可能可以忽略不计。