我正在使用Mockito模拟Jersey客户端API。我有一个模拟响应,它会返回一个nullPointerException
。
这就是我到目前为止所做的
when(invocationBuilder.post(Entity.entity(anyString(),MediaType.APPLICATION_XML))).thenReturn(response);
有没有办法解决这个问题。谢谢,
不能像那样使用Mockito匹配器:它们只能在顶级中使用(此处,作为post
的参数)。此外,当您使用一个匹配器时,必须对所有参数使用匹配器。我在这里写了更多关于火柴人的文章。
像anyString
这样的匹配器实际上返回null
,而NullPointerException很可能来自于Entity.entity
未能接受null
值。(当您在when
或verify
语句中正确使用匹配器时,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());
或者使用自定义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);