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)
有没有办法在没有为测试创建真实文件的情况下这样做?
既然你想模拟文件的读取,我假设你在这个类中有一些你想要独立测试的逻辑(不使用实际文件),因此我建议:
将阅读文件的责任转移到一个单独的类中,因此不需要:
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来模拟此静态方法.
| 归档时间: |
|
| 查看次数: |
6445 次 |
| 最近记录: |