我试图为采用String文件名的方法编写单元测试,然后打开文件并从中读取。因此,为了测试该方法,我考虑编写一个文件,然后调用我的方法。但是,在构建服务器场中,无法将文件任意写入磁盘。有没有标准的方法来模拟"在我的单元测试中有一个真实的文件?
答案 0 :(得分:17)
我发现Mockito和Powermock是一个很好的组合。实际上有一个带有样本的blog post,其中File-class的构造函数被模拟用于测试目的。这里也是一个小例子:
public class ClassToTest
{
public void openFile(String fileName)
{
File f = new File(fileName);
if(!f.exists())
{
throw new RuntimeException("File not found!");
}
}
}
使用Mockito + Powermock进行测试:
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassToTest.class)
public class FileTest
{
@Test
public void testFile() throws Exception
{
//Set up a mocked File-object
File mockedFile = Mockito.mock(File.class);
Mockito.when(mockedFile.exists()).thenReturn(true);
//Trap constructor calls to return the mocked File-object
PowerMockito.whenNew(File.class).withParameterTypes(String.class).withArguments(Matchers.anyString()).thenReturn(mockedFile);
//Do the test
ClassToTest classToTest = new ClassToTest();
classToTest.openFile("testfile.txt");
//Verify that the File was created and the exists-method of the mock was called
PowerMockito.verifyNew(File.class).withArguments("testfile.txt");
Mockito.verify(mockedFile).exists();
}
}
答案 1 :(得分:0)
如何使用模拟的流类,它完全覆盖真实的类(如BufferredReader,File)(意味着你使用的所有方法或所有方法)?数据可以保存为字节数组,例如,在某些单例中,如果要在不同的测试类之间使用它们。
答案 2 :(得分:0)
如果使用JUnit,则有TemporaryFolder。测试后删除文件。页面上给出的示例:
public static class HasTempFolder {
@Rule
public TemporaryFolder folder= new TemporaryFolder();
@Test
public void testUsingTempFolder() throws IOException {
File createdFile= folder.newFile("myfile.txt");
File createdFolder= folder.newFolder("subfolder");
// ...
}
}
但是,我还用它来测试我的Android类读/写功能,如:
[...]
pw = new PrintWriter(folder.getAbsolutePath() + '/' + filename);
pw.println(data);
答案 3 :(得分:-2)
这是非常不赞成的:
最小量的可测试代码。通常是单个方法/功能, 没有使用其他方法或类。快速!成千上万的单位 测试可以在十秒或更短的时间内运行!单元测试永远不会使用:
- 数据库
- 应用服务器(或任何类型的服务器)
- 文件/网络I / O或文件系统;
- 另一个申请;
- 控制台(System.out,System.err等)
- 登录
- 大多数其他类(例外包括DTO,String,Integer,mocks以及其他一些类)。 “
如果您必须从文件中读取,请预先生成一个所有单元测试都读取的测试文件。无需向磁盘写入任何内容。