java - 使用 mockito 和 junit 测试图像
问题描述
我有一个将 MultipartFile 对象作为参数的方法。在我使用的方法里面ImageIO.read(some_value)
and ImageIO.write(some_value)
。我想用模拟图像测试这个方法(我不想将图像存储在资源文件夹下)。
我试过这个:
MockMultipartFile file = new MockMultipartFile("file", "boat.jpg", "image/jpeg", "content image".getBytes());
但没有成功。
public void f(MultipartFile file) throws IOException {
final BufferedImage read = ImageIO.read(new ByteArrayInputStream(file.getBytes()));
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
ImageIO.write(read, "jpg", baos);
}
}
当我运行测试时,read
变量具有null
值。我认为这个问题来自"content image".getBytes()
.
是否可以使用模拟图像而不是真实图像?
解决方案
"content image".getBytes()
返回byte[]
String 的表示形式"content image"
。应该如何ImageIO
从中构建一个BufferedImage
?
您在这里有两个选择。
byte[]
将真实数据传递给MockMultipartFile
- 既然您提到您不想使用模拟图像资源,这似乎不太合适。
- 使用Powermock的Mock
ImageIO
的静态方法- 模拟方法将返回
BufferedImage
您的方法可以使用的真实值,而无需从文件中读取图像。 write()
如果您愿意,这也为您提供了能够模拟调用的额外好处。- 示例代码:
- 模拟方法将返回
PowerMockito.mockStatic(ImageIO.class);
when(ImageIO.read(any())).thenAnswer(invocation -> {
Object argument = invocation.getArguments()[0];
// here you can check what arguments you were passed
BufferedImage result = new BufferedImage(600, 400, BufferedImage.TYPE_INT_RGB); // create a BufferedImage object
// here you can fill in some data so the image isn't blank
return result;
});
现在,当您的被测方法调用imageIO.read()
时,它将接收BufferedImage
您在 lambda 中构造的内容,而无需实际读取任何文件。
推荐阅读
- java - 一种将天数转换为日期的方法
- excel - Excel - 单元格包含列表中的值 - 返回列表值但避免返回不正确的值
- python - 新的 selenium 包,尝试输入登录信息
- python - Python pandas 在列值上应用函数(基于列名模式)
- python - 将空白或空格替换为零
- php - Yii2 如何根据用户类型注销用户
- julia - ArgumentError: No key column found Unstack Error?
- javascript - 如何使用 javascript 处理启动应用程序确认框
- node.js - nodejs中引入的生成器和yield关键字是什么版本?
- python - Pandas 数据帧中的条件丰富