如何使用Mockito模拟实体

时间:2015-12-02 20:22:09

标签: mockito

我正在使用Mockito来模拟Jersey Client API。我有一个模拟响应,它返回when(invocationBuilder.post(Entity.entity(anyString(),MediaType.APPLICATION_XML))).thenReturn(response);

这是我到目前为止所做的事情

key=

无论如何要解决这个问题。 谢谢,

1 个答案:

答案 0 :(得分:1)

你不能像这样使用Mockito匹配器:它们只能用在顶层(这里作为post的参数)。此外,当您使用一个匹配器时,您必须对所有参数使用匹配器。我写过more about matchers here

anyString之类的匹配器实际返回null,而您的NullPointerException可能来自Entity.entity无法接受null值。 (当您在whenverify声明中正确使用匹配器时,Mockito无论如何都会截取该呼叫,因此null不会干扰任何内容。)

相反,您需要返回所有内容的响应,然后使用ArgumentCaptor稍后确保MediaType为APPLICATION_XML:

when(invocationBuilder.post(any())).thenReturn(response);
/* ... */
ArgumentCaptor<Entity> captor = ArgumentCaptor.forClass(Entity.class);
verify(invocation).post(captor.capture());
assertEquals(APPLICATION_XML, captor.getValue().getMediaType());

或使用a custom ArgumentMatcher<Entity>来匹配:

ArgumentMatcher<Entity> isAnXmlEntity = new ArgumentMatcher<Entity>() {
  @Override public boolean matches(Object object) {
    if (!(entity instanceof Entity)) {
      return false;
    }
    Entity entity = (Entity) object;
    return entity.getMediaType() == APPLICATION_XML;
  }
};
when(invocationBuilder.post(argThat(isAnXmlEntity)).thenReturn(response);