我有一个类将视频作为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);
}
}
我嘲笑这种逻辑的方法是什么?
答案 0 :(得分:1)
问题是,该URL是最终的,因此您必须至少使用Mockito 2来模拟它。如果您准备这样做,我会看到两种可能性:
a)将url放入方法而不是字符串,从而允许您在其中放置一个模拟的URL。那将是最简单的方法。然后,您还可以创建第二个便捷方法,从字符串创建所述URL。这两种方法更容易测试,因为它们的范围更小。
b)将final URL url = new URL(videoUrl);
部分提取到一个新类中,例如URL Factory,然后模拟它以在测试中返回一个模拟的URL对象。
只要在方法中使用“new”生成内容,此方法就会变得更难测试,因为您现在无法将此测试与此对象生成分开。
答案 1 :(得分:0)
AFAIK,您无法使用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();
如果这不适合你,请告诉我。