用Java模拟文件

时间:2012-08-07 15:57:17

标签: java unit-testing

我试图为采用String文件名的方法编写单元测试,然后打开文件并从中读取。因此,为了测试该方法,我考虑编写一个文件,然后调用我的方法。但是,在构建服务器场中,无法将文件任意写入磁盘。有没有标准的方法来模拟"在我的单元测试中有一个真实的文件?

4 个答案:

答案 0 :(得分:17)

我发现MockitoPowermock是一个很好的组合。实际上有一个带有样本的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以及其他一些类)。 “
  •   

Source

如果您必须从文件中读取,请预先生成一个所有单元测试都读取的测试文件。无需向磁盘写入任何内容。