junit 从目录加载资源的最佳实践

hgb9j2n6  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(92)

我有一个Java类com.example.business.ContentEvaluator的JUnit测试,我想加载不同的资源来验证某个方法public boolean isGreat(byte[] content)。有两个参数化测试,一个测试方法预期返回true的行为,另一个测试方法预期返回false的行为。
在测试资源文件夹src/test/resources/com/example/business/中,现在有两个子文件夹trueContentfalseContent,每个子文件夹包含大约5个我想在测试中加载的资源文件。
在单元测试中加载这些资源的最佳实践是什么?
我看到的选项:
1.列出给定子文件夹中的所有文件并加载其中的内容。示例:

Files.list(Paths.get(ContentEvaluatorTest.class.getResource("trueContent").toURI()))
...
String testedContent = Files.readString(file)

字符串
测试会自动选取新文件,但您无法看到代码使用了哪个文件,因为文件名从未写在代码中。此外,此选项依赖于文件系统的存在(将资源转换为实际文件/路径的能力)。
1.将资源文件名放在测试中的列表中,并将其覆盖以不依赖于文件系统。示例:

private static final List<String> TRUE_CONTENT_FILENAMES = Arrays.asList("data1.pdf", "bigData.csv", "small.txt");
...
for (String resourceFilename : TRUE_CONTENT_FILENAMES) {
  String testedContent = new String (ContentEvaluatorTest.class.getResourceAsStream("trueContent" + resourceFilename ).readAllBytes(), StandardCharsets.UTF_8);
}


搜索资源文件名将显示使用资源的测试,但如果以任何方式调整资源文件集(文件添加/删除/重命名),则也需要调整String列表。
哪个选项更好?或者有其他选项比这两个更好?

nkkqxpd9

nkkqxpd91#

从类路径中获取资源是可能的,尽管性能稍差一些(参见SO:3923129),这可能值得考虑。也就是说,我不认为您可能会遇到在没有文件系统的环境中运行单元测试的情况,并且您的技术是跨平台兼容的。
我支持选项1,因为它维护起来不那么复杂。如果它找不到任何测试数据,我会强调测试失败。

相关问题