这是我的一段代码:
import java.net.URI;
import javax.ws.rs.core.UriInfo;
(...)
UriInfo mockUriInfo;
String url = "test";
mockUriInfo = mock(UriInfo.class);
when(mockUriInfo.getRequestUri()).then(new URI(url));
不幸的是,我有一个错误:
then(org.mockito.stubbing.Answer) cannot be applied to (java.new URI)
知道我该怎么解决吗?
您需要使用thenReturn而不是then:
when(mockUriInfo.getRequestUri()).thenReturn(new URI(url));
如果你想使用then(这是thenAnswer的同义词,你需要传递一个答案作为参数:
when(mockUriInfo.getRequestUri()).then(new Answer<Integer>() {
public URI answer(InvocationOnMock invocation) throws Throwable {
return new URI(url);
}
}
不要模拟您不拥有的类型
真的,99%的时候都是错的。相反,最好使用真实对象或使用集成测试(使用RESTAssured或其他方法)。
在mockito wiki上:不要嘲笑你不拥有的类型!
这不是一条硬线,但越过这条线可能会产生影响!(很可能会。)
- 想象一下模拟第三方lib的代码。在对第三个库进行特定升级后,逻辑可能会发生一些变化,但测试套件会执行得很好,因为它被嘲笑了。所以后来,认为一切都很好,建造墙毕竟是绿色的,软件已经部署好了吊杆
- 这可能是一个迹象,表明当前的设计与这个第三方库的解耦程度不够
- 另一个问题是,第三方lib可能很复杂,甚至需要大量mock才能正常工作。这导致了过度指定的测试和复杂的固定装置,这本身就损害了紧凑和可读的目标。或者由于模拟外部系统的复杂性,测试没有充分覆盖代码
相反,最常见的方法是围绕外部lib/系统创建包装器,尽管应该注意抽象泄漏的风险,因为太多的低级别API、概念或异常超出了包装器的边界。为了验证与第三方库的集成,编写集成测试,并使其尽可能紧凑和可读。