首页 > 解决方案 > 使用 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().

是否可以使用模拟图像而不是真实图像?

标签: javajunitmockito

解决方案


"content image".getBytes()返回byte[]String 的表示形式"content image"。应该如何ImageIO从中构建一个BufferedImage

您在这里有两个选择。

  1. byte[]将真实数据传递给MockMultipartFile
    • 既然您提到您不想使用模拟图像资源,这似乎不太合适。
  2. 使用Powermock的MockImageIO的静态方法
    • 模拟方法将返回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 中构造的内容,而无需实际读取任何文件。


推荐阅读