Junit - 模拟文件

use*_*391 2 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;
  }
Run Code Online (Sandbox Code Playgroud)

我正在使用模拟文件:

File mockedFile = Mockito.mock(File.class);
Run Code Online (Sandbox Code Playgroud)

但我在'toPath'上得到了一个例外.所以我添加了一些路径或null,但是我再次获得了Exceptions,因为路径中不存在该文件.

when(mockedFile.toPath()).thenReturn(Paths.get("test.txt"));
Run Code Online (Sandbox Code Playgroud)

得到:

com.http.ApiException: There was a problem reading the file: test.txt
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有为测试创建真实文件的情况下这样做?

Ada*_*ion 6

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

将阅读文件的责任转移到一个单独的类中,因此不需要:

byte[] data = Files.readAllBytes(((File) body).toPath());
Run Code Online (Sandbox Code Playgroud)

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

byte[] data = fileReader.read(body);
Run Code Online (Sandbox Code Playgroud)

并且fileReader将与沿着这些路线非常简单的实现你的类的实例:

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

然后在你的测试中你可以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);
  }
};
Run Code Online (Sandbox Code Playgroud)

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