java - 模拟; 模拟调用 lambda 的方法,并验证该 lambda 调用的另一个模拟
问题描述
我的问题与此类似:
使用模拟;是否可以模拟一个将 lambda 作为参数并断言 lambda 捕获的变量的方法?
但不同的是,我仍然需要一段时间才能弄清楚:
如何验证在传递给另一个模拟对象的方法的 lambda 中使用的模拟调用的方法?
这可能看起来很复杂,但在 Java 8 库(如 JDBI)中经常发生这种情况,例如,您有一个 JDBI 对象:
JDBI MyDBConnection
你应该嘲笑。然后将其与 withHandle 方法一起使用以传递实现 HandleCallback<R,X> 类型的 lambda:
//code I'm testing. I implement the lambda, and want to verify it
//calls the correct method in dao provided by JDBI.
MyDBConnection.withHandle(
(handle) -> { ... handle.attach(SomeDao.class).findSomethingInDB(args) .. }
这是推荐的方法。
所以我想验证是否调用了 findSomethingInDB(eq(args))。
就像我说的那样,这很相似,但又足够不同,至少,当我忘记如何做到这一点时,我至少会发现这个答案很有价值。因此,调用我的 lambda 的原始 3rd 方库方法的处理类似于上面引用的问题中给出的答案,但有一些调整:
when(JDBIMock.withHandle(any())).then(
//Answer<Void> lambda
invocationOnMock -> {
Object[] args = invocationOnMock.getArguments();
assertEquals(1, args.length);
//the interface def for the callback passed to JDBI
HandleCallback lambda = (HandleCallback) args[0];
when(mockHandle.attach(SomeDao.class)).thenReturn(mockDao);
//this actually invokes my lambda, which implements the JDBI interface, with a mock argument
lambda.withHandle(mockHandle);
//bingo!
verify(mockDao).findSomethingInDB(eq(args));
}
)
解决方案
看到这个问题,上面应该充分回答;)
推荐阅读
- javascript - 如何用打字稿接口映射json?
- mysql - 更新某些行时忽略唯一键(mariaDB)
- mysql - MySQL SELECT / GROUP BY losing NULLs
- java - 尝试 catch 将我的变量重置为原始值,即使它是全局变量
- java - 发现多个 ejb 的接口类型为用于绑定
- ruby - 如何在 Windows 上的 ruby 中修复 (RubyInstaller::Runtime::DllDirectory::WinApiError)?
- python - 在 python 3.7 中使用 exec() 导入别名不起作用
- ruby-on-rails - 通过细化添加的方法在 Rails 控制器中不可见
- tensorflow - Keras 损失为负,准确率下降,但预测良好?
- python - Python:出现错误:TypeError:“int”类型的参数不可迭代