0

我有需要为其创建 JUnit 测试的方法:

public class MyClass {
  private String file1;
  private String file2;

  public void myMethodSpaceCheck(){
    if (new File(file1).size() > new File(file2).size() {
       throw new Exception .....  
    } 
  }
}

是否可以使用 Mockito 创建该 JUnit 测试?

4

1 回答 1

2

在使用 Java 处理文件时,我首选的选择是使用 Apache VFS,因为我可以将它们视为任何其他 POJO。显然,当您已经被 File API 困住时,这需要做很多工作。

另一种选择是完全忘记 Mockito 并将这些文件写入系统。我通常会避免这种情况,因为它有时会使测试在某些系统上并行运行变得更加困难。

对于这种特定情况,我的解决方案通常是提供一个特殊的类,比如 FileBuilder,它可以实例化新的文件:

public class FileBuilder {
  public java.io.File newFile(String pathname) {
    return new java.io.File(pathname);
  }
}

然后我在将它传递给 MyClass 之前模拟这个类,并根据需要对其进行检测:

@Test(expected = Exception.class)
public void should_fail_when_file1_is_bigger_than_file2() {
  FileBuilder mockFile1 = file(2L);
  FileBuilder mockFile2 = file(1L);
  FileBuilder mockFileBuilder = mock(FileBuilder.class);
  when(mockFileBuilder.newFile("file1").thenReturn(mockFile1);
  when(mockFileBuilder.newFile("file2").thenReturn(mockFile2);

  new MyClass(mockFileBuilder).myMethodSpaceCheck();
}

private static File file(long length) {
    File mockFile = mock(File.class);
    when(mockFile.length()).thenReturn(length);
    return mockFile;
}

(您的示例提到 File.size();我假设您的意思是 File.length())

MyClass 的实际实现如下所示:

public class MyClass {
  private String file1;
  private String file2;
  private final FileBuilder fileBuilder;

  public MyClass() {
    this(new FileBuilder());
  }

  @VisibleForTesting
  MyClass(FileBuilder fileBuilder) {
    this.fileBuilder = fileBuilder;
  }

  public void myMethodSpaceCheck() //...
}
于 2012-11-13T10:35:38.563 回答