为什么我的Mockito模拟对象使用真实的实现

时间:2010-12-28 17:16:20

标签: java unit-testing apache mocking mockito

我遇到了模拟Apache Http客户端的问题。以下尝试创建模拟:

DefaultHttpClient httpClient = Mockito.mock(DefaultHttpClient.class);

无法创建真正的模拟。上面的行没有异常执行,但是当我尝试存根某些行为时:

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?

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

我在OSX上使用Mockito 1.8.5,Apache httpclient 4.0.3,Apache http核心4.1,JDK 1.6.0

2 个答案:

答案 0 :(得分:16)

AbstractHttpClient上的一些方法是最终的,因此不会被嘲笑。 IMO,这种行为是不模仿具体类的首要原因。

答案 1 :(得分:3)

尝试这种语法(只是一个示例,而不是真正的代码):

import static Mockito.*;
// ...
HttpClient httpClient = mock(HttpClient.class);
doReturn(null).when(httpClient).execute(anyObject()).

有关问题/解决方案的更好解释,请参阅此链接:http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#doReturn(java.lang.Object