代码之家  ›  专栏  ›  技术社区  ›  Almas Abdrazak

如何模拟JAX RS的流输出

  •  0
  • Almas Abdrazak  · 技术社区  · 8 年前

    我有一个类,它将视频作为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 回复  |  直到 8 年前
        1
  •  1
  •   Florian Schaetz    8 年前

    问题是,这个URL是最终的,所以你必须使用mockito 2来模拟它。如果你准备好了,我可以看到两种可能性:

    a)在方法中给出URL,而不是字符串,从而允许您在其中放置模拟的URL。这将是最简单的方法。然后您还可以创建第二个方便方法,该方法从字符串创建所述URL。这两种方法的测试范围较小,因此比较容易测试。

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

    一旦在方法中生成带有“新”内容的东西,这个方法就会变得更难测试,因为您现在无法将这个测试与这个对象生成分离。

        2
  •  0
  •   Extreme    8 年前

    阿法克,你不能嘲笑 final static 方法/类使用 mockito . 你得依靠 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();
    

    如果这对你不起作用,请告诉我。

    推荐文章