如何从jax-rs模拟StreamingOutput

时间:2018-05-28 02:16:40

标签: java mockito jax-rs

我有一个类将视频作为mp4文件发送给用户(Http请求/响应) 我想用主逻辑模拟方法来测试它。我的代码

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 :(得分:1)

问题是,该URL是最终的,因此您必须至少使用Mockito 2来模拟它。如果您准备这样做,我会看到两种可能性:

a)将url放入方法而不是字符串,从而允许您在其中放置一个模拟的URL。那将是最简单的方法。然后,您还可以创建第二个便捷方法,从字符串创建所述URL。这两种方法更容易测试,因为它们的范围更小。

b)将final URL url = new URL(videoUrl);部分提取到一个新类中,例如URL Factory,然后模拟它以在测试中返回一个模拟的URL对象。

只要在方法中使用“new”生成内容,此方法就会变得更难测试,因为您现在无法将此测试与此对象生成分开。

答案 1 :(得分:0)

AFAIK,您无法使用final模拟staticmockito个方法/类。你必须依赖PowerMockito。我目前无法测试你的方法,但如果你想模拟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();

如果这不适合你,请告诉我。