Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JUnit:静态最终属性的初始化_Java_Junit_Static Initialization - Fatal编程技术网

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

Java JUnit:静态最终属性的初始化,java,junit,static-initialization,Java,Junit,Static Initialization,在我的单元测试中,经常会有从资源文件读取并存储到测试类的静态属性中的装置: public class TestFoo { private static String fileContents; @BeforeClass public static void setup() throws IOException { fileContents = ... read TestFoo.class.getResourceAsStream("filename")

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

public class TestFoo {

    private static String fileContents;

    @BeforeClass
    public static void setup() throws IOException {
        fileContents = ... read TestFoo.class.getResourceAsStream("filename") ... 
    }   
}
这是可行的,但我的问题是,我通常不喜欢测试中的非最终静态数据,因为它允许一个测试用例影响另一个测试用例的输出(在上面的示例中,如果一个测试将
fileContents
重新分配给其他测试,那么在使用夹具数据的其他测试中会有副作用)

但是,如果我添加最后一个修饰符,那么赋值必须在声明时发生,这在初始化非常重要时是一个问题(例如在上面的示例中,初始化代码可能会触发选中的异常)。另一种方法是使用静态初始值设定项块:

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,或者有更好/更典型的方法初始化静态最终资源?

我会使用
@BeforeClass
,因为它不太冗长。如果您担心有人会意外覆盖该值,您也可以使用
@Before
。除非文件很大,否则运行时verhead可能可以忽略不计。

既然字段是私有的,那么另一个测试如何更改字段的值呢?为什么不使用@Before annotation而不是@BeforeClass?@jbnize在一个类中设置多个测试用例?您可以有一个方法将文件作为字符串加载,并抛出未经检查的异常。@jbniset:不是另一个测试套件,而是两个测试用例我在
TestFoo
类中。我可能应该在
@之前更新它
@是半有效的:您需要删除最后的限定符才能走这条路,但这意味着尽管单个测试用例是独立的,但仍然有可能(尽管可能性很小)在单个测试用例中覆盖该值。并且I/O可能是禁止的,不仅当文件不是很小时,而且当您有大量测试用例时(使用
@之前的
,您将为每个测试用例支付“可忽略”的I/O成本,包括不使用读取值的测试用例)。这是可读性和安全性之间的折衷,我个人认为生产代码和测试的最佳点是不同的。至于性能,不要过早优化。文件可能会缓存在内存中,如果这些不仅仅是单元测试(无论如何都不应该使用文件),这可能无关紧要。如果你发现了,你仍然可以重新考虑你的决定。最终,这里没有单一的最佳解决方案,这取决于你打电话。