【发布时间】:2018-06-26 09:47:07
【问题描述】:
如何使用 Mockito 模拟接受 lambda 的方法,以便能够控制将哪些参数传递给回调?我特别想模拟这样使用的JDBI method useExtension:
jdbi.useExtension(OrgUnitDao.class, dao -> {
// Skip if already loaded
// Skip if already loaded
if (dao.orgUnitsAreLoaded()) {
我想将dao 对象替换回回调中,这样我就可以使用dao.orgUnitsAreLoaded() 的返回值来控制分支。
签名是这样的
public <E,X extends Exception> void useExtension(Class<E> extensionType,
ExtensionConsumer<E,X> callback)
throws NoSuchExtensionException,
X extends Exception
【问题讨论】:
-
我们不能只模拟界面
ExtensionConsumer吗? -
这不对吧?这就是方法的用户传入的内容,我不想模拟回调(它包含我要测试的逻辑)。我想控制传入的
E类型参数到回调。所以我首先需要匹配参数,然后我可以使用mock(OrgUnitDao.class)和when(mock.orgUnitsAreLoaded())调用回调 -
您是否正在尝试测试您的回调,如果是,它与
useExtension方法无关,也许您需要将其重构为命名方法。 -
这不是一个不合理的建议,但 lambda 关闭了封闭范围内的许多变量。重构意味着传递很多我不想处理的状态。不过,我已经完成了一半......
-
lambda 函数或匿名类本来就是要简短的,如果你需要测试,那么可能它们太复杂了。