Почему мой объект Mockito использует реальную реализацию - PullRequest
10 голосов
/ 28 декабря 2010

У меня была проблема с насмешливым клиентом 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. при переходе к AbstractHttpClient?

Я нашел решение этой конкретной проблемы: используйте интерфейс HttpClient вместо попытки смоделировать конкретный подкласс.В этом случае это гораздо лучшее решение, но мне интересно, что здесь вообще происходит?Почему я не могу издеваться над этим конкретным классом с помощью Mockito?Есть ли что-то особенное в DefaultHttpClient?Есть ли другие случаи, когда Mockito не может издеваться над конкретными классами?

Я использую Mockito 1.8.5, Apache httpclient 4.0.3, Apache http core 4.1, JDK 1.6.0 в OSX

Ответы [ 2 ]

16 голосов
/ 28 декабря 2010

Некоторые из методов AbstractHttpClient являются окончательными и, следовательно, не будут подвергаться проверке. ИМО, это поведение - причина № 1 не издеваться над конкретными классами.

3 голосов
/ 28 декабря 2010

Попробуйте этот синтаксис (просто пример, а не реальный код):

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)

...