Junit - 模拟文件

时间:2017-03-22 13:22:54

标签: java junit mockito

我试图涵盖处理文件的代码。我试图避免使用真实文件进行测试,所以我使用的是Mockito。 这是我试图测试的代码:

try {
    byte[] data = Files.readAllBytes(((File) body).toPath());
    immutableBody = data;
    actualHeaderParams.put(HttpHeaders.CONTENT_LENGTH, (new Integer(data.length)).toString());
    contentType = MediaType.APPLICATION_OCTET_STREAM;
  }

我正在使用模拟文件:

File mockedFile = Mockito.mock(File.class);

但我在#to;'上遇到了例外情况。所以我添加了一些路径或null,但是我再次获得了Exceptions,因为文件不存在于路径中。

when(mockedFile.toPath()).thenReturn(Paths.get("test.txt"));

得到:

com.http.ApiException: There was a problem reading the file: test.txt

如果没有为测试创建真实文件,有没有办法呢?

3 个答案:

答案 0 :(得分:6)

由于你想模拟文件的读取,我假设你在这个类中有一些你想要独立测试的逻辑(不使用实际文件),因此我建议:

将阅读文件的责任转移到一个单独的类中,而不是:

byte[] data = Files.readAllBytes(((File) body).toPath());

与您的业务逻辑交错,有:

byte[] data = fileReader.read(body);

fileReader将是您班级的一个实例,其实现非常简单:

class FileToBytesReader { 
  byte[] read(File file) throws IOException {
    return Files.readAllBytes(((File) body).toPath());
  }
}

然后在您的测试中,您可以使用模拟替换fileReader,您可以设置期望。

如果您使用的是Java 8,则不必创建FileToBytesReader类,但可以使用java.util.Function

Function<File, byte[]> fileReader = (file) -> {
  try {
    return Files.readAllBytes(((File) file).toPath());
  } catch (IOException e) {
    throw new UncheckedIOException(e);
  }
};

顺便说一句。如果您正在处理遗留代码而无法更改生产代码,则必须使用PowerMock来模拟此静态方法。

答案 1 :(得分:0)

我不确定有一种简单的方法,但我可能错了。您可能需要模拟静态Files.readAllBytes()方法,您需要使用类似PowerMock的方法。或者您可以将其包装在一个方法中,然后您可以模拟以下行为:

@OnClick(R.id.cancel_payment_button)
public void onCancelClick(View target) {
        ...
    }

然后对这个方法进行模拟:

 public byte[] getAllBytesWrapper(File body) {
     return Files.readAllBytes(body.toPath());
 }

答案 2 :(得分:0)

使用Matchers.any()作为参数模拟Files.readAllBytes()。并返回一个字节数组。