我在模拟 Apache Http 客户端时遇到了问题。以下尝试创建模拟:
DefaultHttpClient httpClient = Mockito.mock(DefaultHttpClient.class);
无法创建真正的模拟。上面的行无一异常(exception)地执行,但是当我尝试对某些行为进行 stub 时:
Mockito.when(httpClient.execute(Mockito.<HttpUriRequest>anyObject())).thenReturn(null);
我从 AbstractHttpClient 中的方法中得到异常:
Exception in thread "main" java.lang.IllegalArgumentException: Request must not be null.
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:572)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:554)
为什么在 Mockito.when 中执行的调用传递给 AbstractHttpClient?
我找到了这个特定问题的解决方案:使用接口(interface) HttpClient 而不是尝试模拟具体的子类。在这种情况下,这是一个更好的解决方案,但我想知道这里发生了什么?为什么我不能用 Mockito 正确模拟这个具体类? DefaultHttpClient 有什么特别之处吗?是否存在 Mockito 无法模拟具体类的其他情况?
我在 OSX 上使用 Mockito 1.8.5、Apache httpclient 4.0.3、Apache http core 4.1、JDK 1.6.0
最佳答案
关于 AbstractHttpClient 的几种方法是最终的,因此不会被 mock 。 IMO,这种行为是不模拟具体类的第一个原因。
关于java - 为什么我的 Mockito 模拟对象使用真实的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4547852/