我正在尝试涵盖处理文件的代码。我试图避免使用真实文件进行测试,所以我使用 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(( 作为参数。 并返回一个字节数组。