gpt4 book ai didi

java - Mockito 验证特定的 lambda 是否已作为 mock 方法中的参数传递

转载 作者:太空狗 更新时间:2023-10-29 22:45:54 27 4
gpt4 key购买 nike

我想测试以下方法:

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

handler.registerMessage(() -> {
dispatcher.dispatch(argument1,
argument2,
argument3);
});

}

MessageHandler 是一个辅助类,它将接受 lambda 形式的功能接口(interface)实现,并将其存储以供以后执行。

有没有办法用 mockito 验证模拟 MessageHandlerdispatchMessage 方法是否已使用特定的 lambda 表达式调用:

意思是,我能不能写这样一个测试:

        @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 试图比较功能接口(interface)的两个不同实现,它们具有不同的哈希码。

那么有没有其他方法可以验证 dispatchMessage() 方法是否已使用返回 void 的 lambda 调用并具有 body 方法dispatcher.dispatch("activityId", "ctxId", 1l,);

最佳答案

是的,你可以。这里的技巧是您必须获取传递给 registerMessage 的 lambda 实例,然后执行该表达式,然后您才能验证结果。

为了提供一个有意义的示例,我创建了这个 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 表达式只是将函数传递给方法的简写形式。在此示例中,函数是 Runnablerun 方法。因此,MessageHandler 接口(interface)的方法 registerMessageRunnable 作为参数。我还包含了 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);
}
}

我们在 registerMessage 的第一次验证中使用的 lambda 表达式有一个 ArgumentCaptor。在验证之后,我们可以从捕获者那里检索 lambda 表达式。 lambda 表达式的类型是 Runnable,定义在 MessageHandler 接口(interface)中。因此,我们可以对其调用 run 方法,然后验证是否使用所有适当的参数调用了 Dispatcher 上的 dispatch 方法。

关于java - Mockito 验证特定的 lambda 是否已作为 mock 方法中的参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41462913/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com