使用 JUnit4 TemporaryFolder 的模拟文件测试失败

Failed test with mock files using JUnit4 TemporaryFolder

我在单元测试中从模拟开始。想要将方法升级为使用文件。 带有一些字符串或数字的模拟可以工作,但现在代码测试失败。 我有 class 方法:

public class FileService {
    public List<File> findFilesUsingSuffix(File root, String suffix) {
        List<File> list = new ArrayList<>();
        if (root.isDirectory()) {
            File[] files = root.listFiles();
            if (files != null) {
                for (File file : files) {
                    list.addAll(findFilesUsingSuffix(file, suffix));
                }
            }
        } else if (root.getName().endsWith(suffix)) {
            list.add(root);
        }
        return list;
    }
}

并测试:

public class FileServiceTest {
    private FileService fileService;
    private TemporaryFolder temporaryFolder;
 
    @Before
    public void setUp() throws Exception {
        fileService = mock(FileService.class);
 
        temporaryFolder = mock(TemporaryFolder.class);
        File file1 = temporaryFolder.newFile("file.java");
        File file2 = temporaryFolder.newFile("file.swf");
        File file3 = temporaryFolder.newFile("file2.java");
        File file4 = temporaryFolder.newFile("picture.jpg");
        File file5 = temporaryFolder.newFile("photo.jpg");
        File file6 = temporaryFolder.newFile("movie.mp4");
        File file7 = temporaryFolder.newFile("music.mp3");
        File file8 = temporaryFolder.newFile("someFile.java");
        File file9 = temporaryFolder.newFile("someDoc.doc");
        File file10 = temporaryFolder.newFile("excelThing.xls");
        File file11 = temporaryFolder.newFolder("java");
    }
 
    @Test
    public void findFilesUsingSuffixIsTrue() throws IOException {
        //given
        List<File> expectedList = List.of(
                new File("file.java"), new File("file2.java"), new File("someFile.java")
        );
 
        when(fileService.findFilesUsingSuffix(ArgumentMatchers.any(File.class),any(String.class))).thenCallRealMethod();
 
        //when
        List<File> result = fileService.findFilesUsingSuffix(temporaryFolder.getRoot(), ".java");
 
        //then
        assertEquals(expectedList, result);
    }
}

我得到的结果是空列表,但我知道我做错了什么

你的mock过程中有一些问题。

  • 您不需要 mock(TemporaryFolder.class),因为 class 是由 JUnit4 提供的,它需要提供 folder/file 名称。

  • 不需要mock(FileService.class),其实是需要测试的

  • 获取临时文件夹作为规则

@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();

这是一个匹配测试并通过的工作代码:

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

public class FileServiceTest {
  private FileService fileService;

  @Rule
  public TemporaryFolder temporaryFolder = new TemporaryFolder();

  @Before
  public void setUp() throws Exception {
    fileService = new FileService();

    File file1 = temporaryFolder.newFile("file.java");
    File file2 = temporaryFolder.newFile("file.swf");
    File file3 = temporaryFolder.newFile("file2.java");
    File file4 = temporaryFolder.newFile("picture.jpg");
    File file5 = temporaryFolder.newFile("photo.jpg");
    File file6 = temporaryFolder.newFile("movie.mp4");
    File file7 = temporaryFolder.newFile("music.mp3");
    File file8 = temporaryFolder.newFile("someFile.java");
    File file9 = temporaryFolder.newFile("someDoc.doc");
    File file10 = temporaryFolder.newFile("excelThing.xls");
    File file11 = temporaryFolder.newFolder("java");
  }

  @Test
  public void findFilesUsingSuffixIsTrue() throws IOException {
    //given
    List<String> expectedList = new ArrayList<>();
    expectedList.add("someFile.java");
    expectedList.add("file2.java");
    expectedList.add("file.java");

    //when
    List<File> result = fileService.findFilesUsingSuffix(temporaryFolder.getRoot(), ".java");

    List<String> allFileNames = result.stream().map(File::getName).collect(Collectors.toList());

    //then
    Assert.assertEquals(expectedList, allFileNames);
  }
}