我在工作测试中有以下内容:
when(client.callApi(anyString(), isA(Office.class))).thenReturn(responseOne);
请注意,客户端是类客户的模拟。
我想更改" isa(office.class)",以告诉它以匹配办公实例的" ID"属性是" 123L"。如何在模拟对象的方法中指定我想要特定的参数值?
编辑:不是重复的,因为我试图在"何时"上使用它,并且链接的问题(以及我发现的其他资源)正在使用"验证"one_answers" servert"上的grigntcaptor和grognnMatcher。我认为我实际上不能做自己正在尝试的事情,并且会以另一种方式尝试。当然,我愿意被证明。
根据要求重新打开,但是解决方案(使用一个参数匹配者)与链接答案中的解决方案相同。自然,在固执时您不能使用ArgumentCaptor
,但其他所有内容都是相同的。
class OfficeWithId implements ArgumentMatcher<Office> {
long id;
OfficeWithId(long id) {
this.id = id;
}
@Override public boolean matches(Office office) {
return office.id == id;
}
@Override public String toString() {
return "[Office with id " + id + "]";
}
}
when(client.callApi(anyString(), argThat(new IsOfficeWithId(123L)))
.thenReturn(responseOne);
因为参数示意器具有单一方法,您甚至可以将其作为Java 8:
中的lambda。when(client.callApi(anyString(), argThat(office -> office.id == 123L))
.thenReturn(responseOne);
如果您已经在使用Hamcrest,则可以使用MockitoHamcrest.argThat
适应Hamcrest Matcher,或使用内置的hasProperty
:
when(client.callApi(
anyString(),
MockitoHamcrest.argThat(
hasProperty("id", equalTo(123L)))))
.thenReturn(responseOne);
我最终使用" eq"。在这种情况下,这是可以的,因为对象很简单。首先,我创建了一个与我希望回来的对象。
Office officeExpected = new Office();
officeExpected.setId(22L);
然后我的"'when"语句变为:
when(client.callApi(anyString(), eq(officeExpected))).thenReturn(responseOne);
这使我比" ISA(Office.class)"获得更好的检查。
为任何具有更复杂对象的人添加答案。
op的答案使用用于简单对象的eq。
但是,我有一个更复杂的对象,其中还有更多字段。创建模拟对象并填写所有字段
是非常痛苦的public class CreateTenantRequest {
@NotBlank private String id;
@NotBlank private String a;
@NotBlank private String b;
...
...
}
我能够使用Refeq实现相同的东西而不设置每个字段的值。
Office officeExpected = new Office();
officeExpected.setId(22L);
verify(demoMock, Mockito.atLeastOnce()).foobarMethod(refEq(officeExpected, "a", "b"));