使用 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);
}
}
我在单元测试中从模拟开始。想要将方法升级为使用文件。 带有一些字符串或数字的模拟可以工作,但现在代码测试失败。 我有 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);
}
}