【问题标题】:Failed test with mock files using JUnit4 TemporaryFolder使用 JUnit4 TemporaryFolder 对模拟文件进行的测试失败
【发布时间】:2021-04-17 15:47:39
【问题描述】:

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

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);
    }
}

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

【问题讨论】:

  • TemporaryFolder 类是什么,为什么要嘲笑该类?
  • howtodoinjava.com/junit/… 我在用这个
  • 您在滥用TemporaryFolder。您在模拟上调用未存根的方法 - 它们被完全忽略。下定决心:要么使用 TemporaryFolder 和真实文件,要么使用模拟。模拟一个未被测试方法使用的类是没有意义的

标签: java unit-testing testing mockito


【解决方案1】:

您的模拟过程中存在一些问题。

  • 您不需要mock(TemporaryFolder.class),因为该类由 JUnit4 提供,需要提供文件夹/文件名。

  • 不用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);
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 2021-12-25
    • 2020-01-05
    • 1970-01-01
    • 2019-11-11
    相关资源
    最近更新 更多