使用Mockito和Junit测试图像

时间:2018-10-14 13:57:34

标签: java junit mockito

我有一个方法将MultipartFile对象作为参数。在方法内部,我使用ImageIO.read(some_value)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()

是否可以使用模拟图像代替真实图像?

1 个答案:

答案 0 :(得分:1)

"content image".getBytes()返回字符串byte[]的{​​{1}}表示形式。 "content image"应该如何从中构造一个ImageIO

您在这里有两个选择。

  1. BufferedImage的真实数据传递到byte[]
    • 由于您提到您不想使用模拟图像资源,因此这似乎不太合适。
  2. 使用 Powermock 模拟MockMultipartFile的静态方法
    • 模拟的方法将返回您的方法可以使用的真实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; }); 时,它将收到您在lambda中构造的imageIO.read(),而无需实际读取任何文件。