JUnit测试中的System.setProperty

3lxsmp7m  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(205)

我正在尝试为我的一个测试用例的java.io.File类的createTempFile方法调用IO异常。
我认为这样做的一种方法是为单个测试用例设置Property值,如下所示:

class TestClass {
    @Test
    testCase1() {
         // do something
    }

    @Test
    testCase2() {
        String oldValue = System.getProperty("java.io.tmpdir");
        System.setProperty("java.io.tmpdir", "/no/such/dir");
        // invoke test case
        System.setProperty("java.io.tmpdir", oldValue);
    }

然而,我遇到的问题是,尽管我只在单个测试用例(testCase2)中设置system属性,但它会影响整个类中的所有其他测试用例,例如testCase(和测试文件夹)。
有人知道我做错了什么吗?
我尝试打印测试用例中System.setProperty("java.io.tmpdir", oldValue)的值,在这些测试用例中,我没有更改该属性,并且它看起来是正确的。

hmtdttj4

hmtdttj41#

问题不在于属性的设置,而在于JDK只初始化用于File.createTempFile的目录一次,并使用该单个初始化的目录,当使用Files中的方法创建临时文件或目录时也是如此。
如果可以更改原始代码,请使用重载的变体,这些变体允许您自己设置目录。例如:

// File tempFile = File.createTempFile("prefix", "suffix");
File tempFile = File.createTempFile("prefix", "suffix", new File(System.getProperty("java.io.tmpdir")));

还有一个问题是如何设置系统属性,更重要的是如何重置系统属性。如果测试失败,重置将不会发生。可以使用try-finally块,或者更简单,使用JUnit Pioneer

class TestClass {
    @Test
    testCase1() {
         // do something
    }

    @Test
    @SetSystemProperty(key = "java.io.tmpdir", value = "/no/such/dir")
    testCase2() {
        // invoke test case
    }

相关问题