10

我在模拟 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 core 4.1、JDK 1.6.0

4

2 回答 2

16

AbstractHttpClient上的一些方法是最终的,因此不会被模拟。IMO,这种行为是不模拟具体类的#1 原因。

于 2010-12-28T18:26:36.377 回答
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 )

于 2010-12-28T17:28:16.943 回答