如何用JUnit测试Java Spring Boot中的Move File



我有一个java Spring Boot应用程序,它在Unprocessed目录中查找文件,处理文件,然后将其移动到Processed目录。我正在尝试使用JUnit编写一个集成测试,测试迁移是否成功。

为此,我在src/test/resources中创建了一个子目录树,用于镜像服务器上的目录。这样,测试就不会绑定到任何一台计算机或服务器。

当我尝试运行测试时,我得到了java.nio.file.DirectoryNotEmptyException

以下是我的集成测试的全文。这个想法是,我有一个测试文件test_file.csv,它永久存在于我的src/test/resources目录中。对于集成测试,我想复制该文件,并将其写入src/test/resources/foo/bar/Unprocessed。如果正在测试的移动逻辑有效,则test_file.csv应最终位于src/test/resources/foo/bar/Processed文件夹中。ProcessedUnprocessed目录在测试开始时都是空的。

如何使此测试不出错?提前谢谢。

@Test
public void processAndMoveSuccessTest() throws IOException {
File originalFileLocation = ResourceUtils.getFile("classpath:test_file.csv");
System.out.println(originalFileLocation.getParent());
String firstPart = originalFileLocation.getParent();
String modifiedFilePath = firstPart.replaceAll("src\\test\\resources\\","src\\test\\resources\\foo\\bar\\Unprocessed\\");
File unprocessedFile = new File(modifiedFilePath);
Path originalFileLocationPath = Paths.get(originalFileLocation.getPath());
unprocessedFile.delete();
Assert.assertFalse(!unprocessedFile.exists());
Path unprocessedFilePath = Paths.get(unprocessedFile.getPath());
File processedFile = new File("src\\test\\resources\\foo\\bar\\Processed\\test_file.csv");
Assert.assertFalse(processedFile.exists());
Files.copy(originalFileLocationPath, unprocessedFilePath, StandardCopyOption.REPLACE_EXISTING);
Assert.assertTrue(processedFile.exists());
int beforeProcess = repo.count();
Assert.assertNotNull(beforeProcess);
Assert.assertTrue(beforeProcess > 0);
File testFile = importService.processAndMoveFile(unprocessedFile);
int afterProcess = repo.count();
Assert.assertTrue(afterProcess > beforeProcess);
Assert.assertEquals(processedFile.getPath(), testFile.getPath());
processedFile.delete();
}

涉及目录的测试最复杂的部分是,如果您的测试意外失败或出错,您的环境中将存在一堆松散的文件。

为了保持理智,我建议在创建文件和目录时使用deleteOnExit();

此功能允许您在完成执行时标记要删除的文件。

File file = new File("test.txt");
Assert.assertTrue(!file.exists());
file.createNewFile();
throw new Exception("Foo");
file.delete();

这个测试可以运行一次,之后它将在断言时不断失败。

File file = new File("test.txt");
file.deleteOnExit();
Assert.assertTrue(!file.exists());
file.createNewFile();
throw new Exception("Foo");
file.delete();

这个带有deleteOnExit的测试可以重复运行,而不会在断言时失败。

如果您正在创建一个目录,它将跟随FILO。

File foo = new File("foo");
foo.mkdir();
foo.deleteOnExit();
File bar = new File("foo/bar.txt");
bar.createNewFile();
bar.deleteOnExit();

这将首先删除bar,然后删除foo。若并没有删除bar,Foo将不会被删除,所以在创建资源和子级时,通过声明deleteOnExit来完成拆卸。

最新更新