gpt4 book ai didi

java - Junit - 模拟一个文件

转载 作者:行者123 更新时间:2023-12-04 20:01:31 28 4
gpt4 key购买 nike

我正在尝试涵盖处理文件的代码。我试图避免使用真实文件进行测试,所以我使用的是 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 来模拟此静态方法。

关于java - Junit - 模拟一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42952930/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com