У нас есть несколько тестов JUnit, которые основаны на создании новых файлов и их чтении. Однако есть проблемы с файлами, которые не создаются должным образом. Но эта ошибка приходит и уходит.
Это код:
@Test
public void test_3() throws Exception {
// Deletes files in tmp test dir
File tempDir = new File(TEST_ROOT, "tmp.dir");
if (tempDir.exists()) {
for (File f : tempDir.listFiles()) {
f.delete();
}
} else {
tempDir.mkdir();
}
File file_1 = new File(tempDir, "file1");
FileWriter out_1 = new FileWriter(file_1);
out_1.append("# File 1");
out_1.close();
File file_2 = new File(tempDir, "file2");
FileWriter out_2 = new FileWriter(file_2);
out_2.append("# File 2");
out_2.close();
File file_3 = new File(tempDir, "fileXXX");
FileWriter out_3 = new FileWriter(file_3);
out_3.append("# File 3");
out_3.close();
....
Ошибка в том, что второй объект файла, file_2, никогда не создается. Иногда. Затем, когда мы пытаемся написать в него, FileNotFoundException
выбрасывается
- Если мы запускаем только этот тестовый сценарий, все работает нормально.
- Если мы запустим этот тестовый файл с ~ 40 тестовыми сценариями, он может не только сработать, но и работать в зависимости от текущего лунного цикла.
- Если мы запустим весь набор тестов, состоящий из примерно 10 * 40 тестовых случаев, он всегда завершится неудачей.
Мы пытались
- добавление снов (5 секунд) после
new File
, ничего
- добавление цикла while, пока
file_2.exists()
не станет true, но цикл никогда не останавливался
- перехватывает SecurityException, IOException и даже бросаемый, когда мы делаем
New File(..)
, но ничего не перехватывается.
В какой-то момент мы получили все файлы, которые должны быть созданы, но файл_2 был создан до файла_1, и тест, проверивший время создания, не удался.
Мы также пытались добавить file_1.createNewFile()
, и оно всегда возвращает true.
Так что происходит? Как мы можем сделать тесты, которые зависят от реальных файлов и всегда быть уверены, что они существуют?
Это было протестировано в Java 1.5 и 1.6, а также в Windows 7 и Linux. Единственное различие, которое можно заметить, заключается в том, что иногда подобный тестовый сценарий раньше не проходит, а иногда вместо него создается файл_1
Обновление
Мы попробовали новый вариант:
File file_2 = new File(tempDir, "file2");
while (!file_2.canRead()) {
Thread.sleep(500);
try {
file_2.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
Это приводит к множеству исключений типа:
java.io.IOException: Access is denied
at java.io.WinNTFileSystem.createFileExclusively(Native Method)
at java.io.File.createNewFile(File.java:883)
... но в итоге все работает, файл создан.