Junit - 模拟文件



我正在尝试涵盖处理文件的代码。我试图避免使用真实文件进行测试,所以我使用 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);

但我在"toPath"上得到一个例外。所以我添加了一些路径或 null,但随后我再次收到异常,因为路径中不存在该文件。

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

获取:

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

有什么方法可以在不为测试创建真实文件的情况下做到这一点?

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

将读取文件的责任移到单独的类中,以便

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 来模拟此静态方法。

我不确定有没有简单的方法,但我可能是错的。您可能需要模拟静态 Files.readAllBytes(( 方法,您需要使用 PowerMock 之类的方法来完成。或者你可以把它包装在一个方法中,然后你可以模拟以下行为:

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

然后模拟此方法:

 when(classUnderTest.getAllBytesWrapper(any(File.class))).thenReturn("test".getBytes());

Mock Files.readAllBytes(( 以 Matchers.any(( 作为参数。 并返回一个字节数组。

相关内容

  • 没有找到相关文章

最新更新