我想在此来源中模仿Func
:
repository.actionOnFile(String path, Consumer<InputStream> action)
问题是第二个参数是lambda表达式。
如何使用mockito模拟它,我需要将输入流传递给@Autowired
private FileRepositoryService repository;
public Document getDocument(URL url) {
MutableObject<Document> obj = new MutableObject<>();
Consumer<InputStream> actionOnFile = inputStream -> obj.setValue(getDocument(inputStream));
try {
repository.actionOnFile(url.toExternalForm(), actionOnFile);
} catch (S3FileRepositoryException e) {
throw e.getCause();
}
return obj.getValue();
}
方法进行测试吗?
答案 0 :(得分:4)
我找到了解决方案!
doAnswer(ans -> {
Consumer<InputStream> callback = (Consumer<InputStream>) ans.getArguments()[1];
InputStream stream = new ByteArrayInputStream(
"test".getBytes(StandardCharsets.UTF_8.name()));
callback.accept(stream);
return null;
}).when(repository).actionOnFile(eq("any"), any(Consumer.class));
答案 1 :(得分:0)
如果您只想模拟Function参数,那么以下内容将起作用:
Mockito.when(convertStringtoInt(Mockito.any(String.class), Mockito.any(Consumer.class))).then[...]
答案 2 :(得分:0)
如何用mockito模拟它,我需要通过接受方法测试 输入流?
在您的情况下,您想要测试getDocument()
方法
所以你需要模拟的是被测试类的依赖:
这是repository
字段。
actionOnFile.add()
更具体地应该被嘲笑
根据您的代码,该方法应该抛出S3FileRepositoryException
,否则会引起代码中不可见的副作用。
在异常情况下,您应该写一些内容:
Mockito.when(fileRepositoryServiceMock.actionOnFile(url.toExternalForm(), actionOnFile)).thenThrow(new S3FileRepositoryException(cause));
在成功的过程中,您应该只验证该方法是否被调用:
Mockito.verify(fileRepositoryServiceMock).actionOnFile(url.toExternalForm(), actionOnFile));
模仿Consumer
真的不是什么大问题
这是一个界面,您可以使用Mockito模拟任何界面。
真正的问题实际上Consumer
不是测试方法的API的一部分
这是一个局部变量
此外,它依赖于代码中未显示的inputStream
字段
你不能也不必嘲笑内部事物
请注意,它还依赖于未经过模拟的重载getDocument()
方法。
因此,如果您希望InputStream
接受inputStream并不需要,则需要提供一致的getDocument()
#39;抛出异常。
长话短说:我认为您应该重新考虑您的设计,以便在另一个类中提取依赖性处理或编写集成测试。