是的你可以。这里的窍门是,您必须到达传递给的lambda实例,
registerMessage然后执行该表达式,然后才能验证结果。
为了一个有意义的示例,我创建了一个
Handler包含
dispatchMessage要测试的类的类:
public class Handler { private Dispatcher dispatcher = new Dispatcher(); public void dispatchMessage(MessageHandler handler, String argument1, String argument2, Long argument3) { handler.registerMessage(() -> { dispatcher.dispatch(argument1, argument2, argument3); }); } interface MessageHandler { void registerMessage(Runnable run); } static class Dispatcher { void dispatch(String a, String b, long c){ // Do dispatch } }}您要记住的是,lambda表达式只是将函数传递给方法的简写形式。在此示例中,函数是的
run方法
Runnable。因此,用于
registerMessage的接口方法
MessageHandler将a
Runnable作为参数。我还包括的实现
Dispatcher,它是从内部调用的
registerMessage。测试如下所示:
@RunWith(MockitoJUnitRunner.class)public class HandlerTest { @Mock private Dispatcher dispatcher; @InjectMocks private Handler classUnderTest; @Captor private ArgumentCaptor<Runnable> registerMessageLambdaCaptor; @Test public void shouldCallDispatchMethod() { final String a = "foo"; final String b = "bar"; final long c = 42L; MessageHandler handler = mock(MessageHandler.class); classUnderTest.dispatchMessage(handler, a, b, c); verify(handler).registerMessage(registerMessageLambdaCaptor.capture()); Runnable lambda = registerMessageLambdaCaptor.getValue(); lambda.run(); verify(dispatcher).dispatch(a, b, c); }}有一个
ArgumentCaptorlambda表达式供我们在的第一次验证中使用
registerMessage。验证之后,我们可以从捕获程序中检索lambda表达式。lambda表达式的类型为
Runnable,如
MessageHandler接口中所定义。因此,我们可以
run在其上调用该方法,然后验证是否已使用所有适当的参数调用
dispatch上的方法
Dispatcher。



