Как смоделировать StreamingOutput из jax-rs - PullRequest
0 голосов
/ 28 мая 2018

У меня есть класс, который отправляет видео в виде файла mp4 пользователю (Http-запрос / ответ). Я хочу использовать метод Mock с основной логикой для его проверки.Мой код

public StreamingOutput videoAsStream(final String videoUrl) {
        try {
            final URL url = new URL(videoUrl);
            return output -> {
                try(final InputStream inputStream = url.openConnection().getInputStream()){
                    IOUtils.copy(inputStream,output);
                    output.close();
                }
            };
        } catch (final MalformedURLException e) {
            log.error("Url exception for url {}",videoUrl);
            throw new UncheckedIOException(e);
        }
    }

Как я могу издеваться над этой логикой?

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Проблема в том, что URL-адрес является окончательным, поэтому вам придется использовать хотя бы Mockito 2, чтобы его смоделировать.Если вы готовы сделать это, я вижу две возможности:

a) Укажите URL-адрес в методе, а не в строке, что позволит вам добавить туда макетированный URL-адрес.Это был бы самый простой метод.Затем вы можете также создать второй вспомогательный метод, который создает указанный URL-адрес из строки.Эти два метода будет легче протестировать, поскольку их область действия меньше.

b) Извлеките часть final URL url = new URL(videoUrl); в новый класс, например, в URL Factory, а затем смоделируйте его, чтобы вернуть в тест тестовый объект URL.

Как только вы произведете материалс «новым» внутри вашего метода, этот метод может стать более трудным для тестирования, потому что теперь вы не можете отделить этот тест от этого объекта генерации.

0 голосов
/ 28 мая 2018

AFAIK, вы не можете смоделировать final и static методы / классы, используя mockito.Вы должны зависеть от PowerMockito.В настоящее время я не могу протестировать ваш метод, но если вы хотите смоделировать final / static, вы можете сделать это в первую очередь, добавив final / static классы к @PrepareForTest, затем

InputStream mockInputStream = Mockito.mock(InputStream.class);
OutputStream mockOutputStream = Mockito.mock(OutputStream.class);
PowerMockito.mockStatic(IOUtils.class);
Mockito.when(IOUtils.copy(mockInputStream, mockOutputStream)).thenReturn(1L);
Mockito.doNothing().when(mockOutputStream).close();

Дайте мне знать, если этоне работает для вас.

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