Используйте mockito и junit для тестирования изображений - PullRequest
0 голосов
/ 14 октября 2018

У меня есть метод, который получает в качестве параметра объект 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 голосов
/ 14 октября 2018

"content image".getBytes() возвращает byte[] представление строки "content image".Как ImageIO должен построить BufferedImage из этого?

У вас есть два варианта здесь.

  1. Передать byte[] реальных данных в MockMultipartFile
    • Поскольку вы упомянули, что не хотите использовать фиктивные ресурсы изображений, это не очень подходит.
  2. Mock *Статические методы 1022 * с использованием Powermock
    • Пересмотренный метод вернет реальный 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, который вы создаете в лямбде, без фактического чтения каких-либо файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...