使用Consumer的模拟方法

时间:2017-11-10 13:43:51

标签: java lambda mocking

我想在此来源中模仿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(); } 方法进行测试吗?

3 个答案:

答案 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;抛出异常。

长话短说:我认为您应该重新考虑您的设计,以便在另一个类中提取依赖性处理或编写集成测试。