10

ApacheHttpクライアントのモックに問題がありました。モックを作成する次の試み:

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)

AbstractHttpClientに渡されたときに、Mockito.in内で実行する呼び出しが行われるのはなぜですか?

この特定の問題の解決策を見つけました。具体的なサブクラスをモックする代わりに、インターフェイスHttpClientを使用してください。この場合、これははるかに優れた解決策ですが、一般的にここで何が起こっているのでしょうか。この具象クラスをMockitoで適切にモックできないのはなぜですか?DefaultHttpClientについて何か特別なことはありますか?Mockitoが具象クラスをモックできない他のケースはありますか?

OSXでMockito1.8.5、Apache httpclient 4.0.3、Apache http core 4.1、JDK1.6.0を使用しています

4

2 に答える 2

16

AbstractHttpClientのメソッドのいくつかは最終的なものであるため、モックされません。IMO、この動作は、具象クラスをモックしない最大の理由です。

于 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 に答える