gpt4 book ai didi

java - 如何在 ArgumentMatcher 之后使用 ArgumentCaptor?

转载 作者:行者123 更新时间:2023-11-29 05:01:42 29 4
gpt4 key购买 nike

我有一些通用接口(interface)可以模拟:

public interface RequestHandler {
public Object handle(Object o);
}

并且这个模拟接口(interface)应该在单个测试中处理不同的请求。

when(mock.handle(isA(ARequest.class))).thenReturn(new AResponse());
when(mock.handle(isA(BRequest.class))).thenReturn(new BResponse());

但我想捕获传递的 BRequest 实例以检查其所有参数。有可能吗?

现在我只看到一个解决方案:构建一个巨大的 ArgumentMatcher 扩展。但是,我不喜欢这样,因为我不会看到 AssertionError 消息。

最佳答案

请记住:虽然匹配器同时用于 stub 和验证,但 ArgumentCaptor 仅用于验证。这使它变得简单:

ArgumentCaptor<BRequest> bCaptor = ArgumentCaptor.for(BRequest.class);
when(mock.handle(isA(BRequest.class))).thenReturn(new BResponse());

systemUnderTest.handle(createBRequest());

verify(mock).handle(bCaptor.capture());
BRequest bRequest = bCaptor.getValue();
// your assertions here

但是请注意,这也意味着您不能使用 ArgumentCaptor 来选择响应。这就是部分模拟或答案的用武之地:

when(mock.handle(any())).thenAnswer(new Answer<Object>() {
@Override public Object answer(InvocationOnMock invocation) {
Object argument = invocation.getArguments()[0];
// your assertions here, and you can return your desired value
}
});

如果您选择 ArgumentMatcher,它可能不会那么可怕,特别是如果您跳过工厂方法并让 Mockito 的反驼峰式外壳成为您的描述:

public static class IsAnAppropriateBRequest extends ArgumentMatcher<Object> {
@Override public boolean matches(Object object) {
if !(object instanceof BRequest) {
return false;
}
BRequest bRequest = (BRequest) object;
// your assertions here
}
}

when(mock.handle(argThat(new IsAnAppropriateBRequest())))
.thenReturn(new BResponse());

关于java - 如何在 ArgumentMatcher 之后使用 ArgumentCaptor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31923766/

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