我试图涵盖处理文件的代码。我试图避免使用真实文件进行测试,所以我使用的是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
如果没有为测试创建真实文件,有没有办法呢?
答案 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()。并返回一个字节数组。