1

所以我有一种将字符串写入文件的方法:

 public static void saveStringToFile(String path, String string) {

    File file = new File(path);
    if (!file.exists()) {
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();

        }
    }

    FileWriter out = null;
    try {
        out = new FileWriter(path);
        out.write(string);
        if (out != null) {
            out.close();
        }
    } catch (FileNotFoundException e) {

        e.printStackTrace();

    } catch (IOException e) {
        e.printStackTrace();
    }

}

我的测试类具有以下 setUp 方法,该方法在每次测试之前运行(在每个测试之前删除测试文件):

public static final String TEST_FILE = "somefile.xml";

//...

@Before
public void setUp() throws IOException {
    if (MyCustomClass.fileExists(TEST_FILE)) {
        new File(TEST_FILE).delete();
    }
}

我的每个测试都尝试使用该方法向文件写入内容saveStringToFile()。它成功了几次,但我终于得到了一个随机点java.io.IOException: Access is denied。不知道为什么会发生这种情况 - 有时它发生在 test1 中,有时在 test3 中......

当我使用 Java7 FileIO 时,它工作正常,但我需要迁移回 Java6 ......

4

3 回答 3

1

您是在测试您是否能够创建、写入和删除文件,还是在测试写入文件的内容?

如果是后者,那么也许您应该模拟/覆盖该saveStringToFile( ... )方法,而是专注于验证您正在单元测试的代码是否确实产生了正确的输出。

如果是前者,那么我非常同意@Omaha 的建议,即您的测试运行程序可能会并行运行多个测试。

希望有帮助。

于 2012-11-20T12:55:13.147 回答
1

异常处理存在一些问题。调用out.close()应该在 finally 块内的单独 try-catch 块中。如果写入文件时抛出异常,则文件永远不会关闭。

我建议您查看诸如 Apache Commons IO 之类的东西,它有许多有用的 IO 方法,例如FileUtils.writeStringToFile().

于 2012-11-20T13:50:55.083 回答
0

所以,可能 JUnit 并没有并行运行它,因为我认为它默认情况下不会这样做。

问题出在我的readfile方法中:

private String readFile(String path) throws FileNotFoundException {
    return (new Scanner(new File(path))).useDelimiter("\\Z").next();
}

为了正常工作,我必须修复

private String readFile(String path) throws FileNotFoundException {
    Scanner scanner = (new Scanner(new File(path)));
    String s = scanner.useDelimiter("\\Z").next();
    scanner.close();
    return s;
}

close()方法是Scanner关键...

于 2012-11-20T13:29:37.973 回答