You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:45:03