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

例外処理にはいくつかの問題があります。toの呼び出しはout.close()、finallyブロック内の別のtry-catchブロック内にある必要があります。ファイルへの書き込み時に例外がスローされた場合、ファイルが閉じられることはありません。

のような多くの便利なIOメソッドを備えたApacheCommonsIOのようなものを検討することをお勧めしますFileUtils.writeStringToFile()

于 2012-11-20T13:50:55.083 に答える
1

ファイルの作成、書き込み、削除ができることをテストしていますか、それともファイルにが書き込まれるかをテストしていますか?

後者の場合、おそらくsaveStringToFile( ... )メソッドをモック/オーバーライドし、代わりに単体テストしているコードが実際に正しい出力を生成することを確認することに集中する必要があります。

前者の場合、テストランナーが複数のテストを並行して実行している可能性が高いという@Omahaの提案に完全に同意します。

それが役立つことを願っています。

于 2012-11-20T12:55:13.147 に答える
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 に答える