检查特定对象属性值时使用Mockito

uyhoqukh  于 2022-11-29  发布在  其他
关注(0)|答案(3)|浏览(149)

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

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

请注意,client是类Client的Mock。
我想更改“isA(Office.class)”,告诉它匹配Office示例的“id”属性为“123L”的位置。如何指定在模拟对象的方法中需要特定的参数值?
编辑:不是重复的,因为我试图在“when”上使用它,而链接的问题(以及我找到的其他资源)在“verify”和“assert”上使用ArgumentCaptor和ArgumentMatcher。我想我实际上不能做我正在尝试的事情,我将尝试另一种方式。当然,我愿意以其他方式显示。

njthzxwz

njthzxwz1#

按要求重新打开,但解决方案(使用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只有一个方法,所以您甚至可以在Java8中将其设置为lambda:

when(client.callApi(anyString(), argThat(office -> office.id == 123L))
    .thenReturn(responseOne);

如果您已经在使用Hamcrest,则可以使用MockitoHamcrest.argThat适配Hamcrest匹配器,或者使用内置的hasProperty

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

bbmckpt72#

我最终选择了"eq"。在这种情况下这是可以的,因为对象非常简单。首先我创建了一个对象,它与我期望得到的相同。

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

然后我的"何时"语句变成:

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

这使我能够比"isA(Office.class)"进行更好的检查。

nwwlzxa7

nwwlzxa73#

为拥有更复杂物体的人添加一个答案。
OP中的答案使用eq,它适用于简单对象。
然而,我有一个更复杂的对象,有更多的字段。创建Mock对象并填充所有字段是相当痛苦的

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

相关问题