Mockito验证特定的lambda已作为模拟方法中的参数传递

我想测试以下方法:

    public void dispatchMessage(MessageHandler handler, String argument1, String argument2, Long argument3) {

handler.registerMessage(() -> {

dispatcher.dispatch(argument1,

argument2,

argument3);

});

}

MessageHandler帮助器类在哪里,该类将接受lambda形式的Functional Interface实现,并将其存储以供以后执行。

有没有一种方法可以通过mockito验证是否已使用特定的lambda表达式调用了模拟dispatchMessage方法MessageHandler

意思是,我可以写这样的测试:

        @Test

public void testDispatchMessage_Success() throws Exception {

myMessageDispatcher.dispatchMessage(handler, "activityId", "ctxId", 1l, );

verify(handler, times(1)).dispatchMessage(() -> {

dispatcher

.dispatch("activityId", "ctxId", 1l,);

});

}

}

此测试将导致断言错误:参数不同!通缉:

......Tests$$Lambda$28/379645464@48f278eb

实际调用有不同的参数:

..........Lambda$27/482052083@2f217633

这是有道理的,因为Mockito尝试比较功能接口的两个不同实现,它们具有不同的哈希码。

那么,是否有其他方法可以验证该方法dispatchMessage()是否已使用返回空值且具有body方法的lambda进行调用

dispatcher.dispatch("activityId", "ctxId", 1l,);

回答:

是的你可以。这里的窍门是,您必须到达传递给的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。验证之后,我们可以从捕获程序中检索l​​ambda表达式。lambda表达式的类型为Runnable,如MessageHandler接口中所定义。因此,我们可以run在其上调用该方法,然后验证是否已使用所有适当的参数调用dispatch上的方法Dispatcher

以上是 Mockito验证特定的lambda已作为模拟方法中的参数传递 的全部内容, 来源链接: utcz.com/qa/411751.html

回到顶部