在检查特定对象属性值时

  • 本文关键字:属性 对象 java mockito
  • 更新时间 :
  • 英文 :


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

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"));

相关内容

  • 没有找到相关文章

最新更新