我在工作测试中有以下内容:
when(client.callApi(anyString(), isA(Office.class))).thenReturn(responseOne);
请注意,客户端是类Client的模拟。
我想更改“isA(Office.class)”以告诉它匹配Office实例的“id”属性为“123L”的位置。如何在模拟对象的方法中指定我想要一个特定的参数值?
编辑:不重复,因为我试图在“when”上使用它,并且链接的问题(以及我发现的其他资源)在“verify”和“assert”上使用ArgumentCaptor和ArgumentMatcher。我想我实际上不能做我正在尝试的事情,并会尝试另一种方式。当然,我愿意以其他方式展示。
答案 0 :(得分:5)
按要求重新打开,但解决方案(使用ArgumentMatcher)与the one in the linked answer相同。当然,在存根时你不能使用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);
因为ArgumentMatcher只有一个方法,你甚至可以在Java 8中将它变为lambda:
when(client.callApi(anyString(), argThat(office -> office.id == 123L))
.thenReturn(responseOne);
如果您已经在使用Hamcrest,则可以使用MockitoHamcrest.argThat
调整Hamcrest匹配器,或使用内置hasPropertyWithValue
:
when(client.callApi(
anyString(),
MockitoHamcrest.argThat(hasPropertyWithValue("id", 123L))))
.thenReturn(responseOne);
答案 1 :(得分:0)
我最终选择&#34; eq&#34;。在这种情况下这是好的,因为对象非常简单。首先,我创建了一个与我期望的相同的对象。
Office officeExpected = new Office();
officeExpected.setId(22L);
然后我的&#39;当&#39;声明变成:
when(client.callApi(anyString(), eq(officeExpected))).thenReturn(responseOne);
这使我能够比&#34; isA(Office.class)&#34;更好地进行检查。