我的问题,这与此相似:
使用Mockito;是否可以模拟一种将lambda作为参数的方法并断言lambda捕获的变量?
,但与众不同,我仍然花了一段时间才能弄清楚这一点是:
我如何验证一种通过模拟使用的方法,该方法被传递给了另一个模拟对象的方法?
例如JDBI MyDBConnection
您应该嘲笑。然后与Fisthandle方法一起使用,以传递实现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的原始第三方库方法类似于上述问题中给出的答案,但进行了一些调整:
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));
}
)
请参阅问题,应在上面充分回答;)
我正在尝试做一些非常相似的事情,与验证在测试中通过模拟jdbi呼叫中传递给withHandle
的另一个模拟的参数。
您在问题中给出的答案将我指向正确的方向,但给我错误消息:
The method then(Answer<?>) in the type OngoingStubbing<Object> is not applicable for the arguments ((<no type> invocationOnMock) -> {})
相反,我必须使用传递给then
的新的org.mockito.stubbing.Answer
,类似于您链接到的另一个问题。
在您的示例中,这将是:
when(JDBIMock.withHandle(any())).then(
//Answer<Void> lambda
new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
Object[] args = invocation.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));
return null; // to match the Void type
}
}
)
在我的情况下,我期望withHandle
的结果列表,因此我必须更改Answer
类型,然后返回answer
的类型以匹配并返回虚拟列表,而不是Void
。(在此测试中返回的实际结果并不重要,只是将预期的论点传递给了我随后的模拟对象)。
我还将verify
呼叫移到了Answer
之外,使我的测试主体更清楚,这是对测试的期望,而不是模拟设置的一部分。