使用TemporaryFolder编写单元测试 查找Java文件方法返回空如何解决
问题梳理
- 参数类型&调用逻辑错误:你定义的
findJavaFiles第一个入参为File类型,但测试时调用该方法传入的是字符串类型的系统临时目录路径,同时mock方法时用ArgumentMatchers.anyString()匹配参数,和原方法签名完全不匹配,方法自然无法得到正确结果。 - 路径指向错误:
TemporaryFolder会创建独立的临时子目录存放测试用文件,你直接传入系统默认临时目录根路径,根本找不到你在setUp中创建的4个测试文件。 - 无意义的File mock:你mock出来的
file1/file2/file3和TemporaryFolder生成的真实文件对象完全是两个不同的实例,哪怕文件名相同,equals比较也永远返回false,断言不可能通过。而且当前场景完全不需要mock File对象,用TemporaryFolder生成的真实文件测试更符合实际运行逻辑。 - 方法冗余参数问题:原方法第二个参数
path完全没有被使用,方法内部硬编码了后缀为.java,递归调用时也没有传路径而是传了后缀,逻辑存在冗余。
修复方案
1. 修正业务方法
先删掉没用的第二个参数,修正方法逻辑:
public List<File> findJavaFiles(File root) { String suffix = ".java"; List<File> list = new ArrayList<>(); if (root.isDirectory()) { File[] files = root.listFiles(); if (files != null) { for (File file : files) { list.addAll(findJavaFiles(file)); } } } else if (root.getName().endsWith(suffix)) { list.add(root); } return list; }
2. 修正单元测试初始化逻辑
删掉无意义的File mock,直接用TemporaryFolder的真实文件构造测试场景:
@Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); // 直接实例化被测类,不需要mock,除非有其他外部依赖 private FileService fileService = new FileService(); private File rootDir; private File file1, file2, file3, file4, subJavaFile; @Before public void setUp() throws IOException { rootDir = temporaryFolder.getRoot(); // 直接创建测试文件,无需mock file1 = temporaryFolder.newFile("file1.java"); file2 = temporaryFolder.newFile("file2.java"); file3 = temporaryFolder.newFile("file3.java"); file4 = temporaryFolder.newFile("file4.jpg"); // 可选:添加子目录场景验证递归逻辑 File subDir = temporaryFolder.newFolder("subDir"); subJavaFile = new File(subDir, "subTest.java"); subJavaFile.createNewFile(); }
3. 修正测试用例
@Test public void findJavaFilesIsCorrect() { // given 构造预期结果 List<File> expectedResult = Arrays.asList(file1, file2, file3, subJavaFile); // when 直接调用真实方法,传入TemporaryFolder的根目录对象 List<File> result = fileService.findJavaFiles(rootDir); // then 断言,因为遍历顺序不固定,建议先判断数量再判断包含关系 Assert.assertEquals(expectedResult.size(), result.size()); Assert.assertTrue(result.containsAll(expectedResult)); }
内容的提问来源于stack exchange,提问作者Lulex97
相关产品推荐
相关产品推荐

