Java 为什么我的Mockito mock对象使用real实现

Java 为什么我的Mockito mock对象使用real实现,java,unit-testing,apache,mocking,mockito,Java,Unit Testing,Apache,Mocking,Mockito,我在模拟ApacheHTTP客户端时遇到了一个问题。以下是创建模拟的尝试: DefaultHttpClient httpClient = Mockito.mock(DefaultHttpClient.class); 无法创建真正的模拟。上面的行执行时没有异常,但当我尝试存根某些行为时: Mockito.when(httpClient.execute(Mockito.<HttpUriRequest>anyObject())).thenReturn(null); 当传递给Abstra

我在模拟ApacheHTTP客户端时遇到了一个问题。以下是创建模拟的尝试:

DefaultHttpClient httpClient = Mockito.mock(DefaultHttpClient.class);
无法创建真正的模拟。上面的行执行时没有异常,但当我尝试存根某些行为时:

Mockito.when(httpClient.execute(Mockito.<HttpUriRequest>anyObject())).thenReturn(null);
当传递给AbstractHttpClient时,为什么调用在Mockito.com内部执行

我找到了这个特定问题的解决方案:使用接口HttpClient,而不是试图模拟具体的子类。在这种情况下,这是一个更好的解决方案,但我想知道这里发生了什么?为什么我不能用Mockito恰当地模拟这个具体的类?DefaultHttpClient有什么特别之处吗?还有其他Mockito不能模拟具体类的情况吗

我在OSX上使用Mockito 1.8.5、ApacheHttpClient 4.0.3、ApacheHttpCore4.1、JDK1.6.0尝试以下语法(只是一个示例,不是真正的代码):


有关问题/解决方案的更好解释,请参见此链接:)

上的一些方法是最终的,因此不会被嘲笑。在我看来,这种行为是不模拟具体类的#1原因。

如上所述,模拟HttpClient接口是有效的,问题在于具体类DefaultHttpClient。在这种情况下,当然建议针对接口而不是默认实现进行模拟。我只是好奇为什么嘲笑不起作用;有时你必须模仿具体的类,然后这些知识就会变得有用。如果你的代码是这样做的,你仍然不能覆盖HttpClient的静态创建。i、 e.HttpClients.createDefault()最终方法可以使用Mockito>2.1.0进行模拟。看见
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)
import static Mockito.*;
// ...
HttpClient httpClient = mock(HttpClient.class);
doReturn(null).when(httpClient).execute(anyObject()).