检查特定对象属性值时的 Mockito

2022-09-04 01:30:47

我在工作测试中有以下内容:

when(client.callApi(anyString(), isA(Office.class))).thenReturn(responseOne);

请注意,客户端是类客户端的模拟。

我想更改“isA(Office.class)”以告知它与Office实例的“id”属性为“123L”的位置相匹配。如何指定在模拟对象的方法中需要特定的参数值?

编辑:不是重复的,因为我试图在“何时”上使用它,并且链接的问题(以及我发现的其他资源)正在使用ArmentCaptor和ArgumentMatcher在“验证”和“断言”上。我想我实际上不能做我正在尝试的事情,并且会尝试另一种方式。当然,我愿意被展示出来。


答案 1

根据请求重新打开,但解决方案(使用 ArgumentMatcher)与链接答案中的解决方案相同。当然,你不能使用当存根时,但其他一切都是一样的。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,则可以使用 来调整 Hamcrest 匹配器,或者使用内置的 hasPropertyWithValueMockitoHamcrest.argThat

when(client.callApi(
         anyString(),
         MockitoHamcrest.argThat(hasPropertyWithValue("id", 123L))))
    .thenReturn(responseOne);

答案 2

我最终选择了“eq”。在这种情况下,这是可以的,因为对象非常简单。首先,我创建了一个与我希望返回的对象相同的对象。

Office officeExpected = new Office();
officeExpected.setId(22L);

然后我的“何时”语句变为:

when(client.callApi(anyString(), eq(officeExpected))).thenReturn(responseOne);

这使我能够比“isA(Office.class)”更好地检查。


推荐