我想测试以下方法:
public void dispatchMessage(MessageHandler handler, String argument1, String argument2, Long argument3) {
handler.registerMessage(() -> {
dispatcher.dispatch(argument1,
argument2,
argument3);
});
}
其中MessageHandler
是一个helper类,它将接受lambda形式的函数接口实现,并将其存储以供以后执行。
是否有一种方法可以使用mockito验证是否使用特定的lambda表达式调用了被模拟的MessageHandler
的dispatchMessage
方法:
意思是,我可以写这样一个测试:
@Test
public void testDispatchMessage_Success() throws Exception {
myMessageDispatcher.dispatchMessage(handler, "activityId", "ctxId", 1l, );
verify(handler, times(1)).dispatchMessage(() -> {
dispatcher
.dispatch("activityId", "ctxId", 1l,);
});
}
}
此测试将导致Assert错误:参数不同!需要:
......Tests$$Lambda$28/379645464@48f278eb
实际调用具有不同的参数:
..........Lambda$27/482052083@2f217633
这是有意义的,因为Mockito试图比较具有不同散列码的函数接口的两个不同实现。
那么,是否有其他方法可以验证方法dispatchMessage()
是否已经被一个返回void的lambda调用,并且其主体方法为dispatcher.dispatch("activityId", "ctxId", 1l,);
?
3条答案
按热度按时间lnlaulya1#
是的,你可以,这里的技巧是你必须得到lambda的示例,它被传递给
registerMessage
,然后执行那个表达式,然后你可以验证结果。为了提供一个有意义的示例,我创建了这个
Handler
类,其中包含您要测试的dispatchMessage
:你需要记住的是lambda表达式只是一个传递函数到方法的简写形式。在这个例子中函数是
Runnable
的run
方法。因此MessageHandler
接口的registerMessage
方法接受Runnable
作为它的参数。我还包含了Dispatcher
的实现。它是从registerMessage
中调用的。测试如下所示:我们在第一次验证
registerMessage
时使用的lambda表达式有一个ArgumentCaptor
。验证之后,我们可以从捕获器中检索lambda表达式。lambda表达式的类型是Runnable
。因此,我们可以在它上面调用run
方法,然后验证在Dispatcher
上调用dispatch
方法时是否使用了所有适当的参数。eeq64g8w2#
你想要计算lambda
argThat(a -> a.get()
,然后才比较它的值:i5desfxk3#
在特定的lambda之外,你可以验证你的方法是用任意lambda表达式调用的,如下所示: