Почему мой mock-объект 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. Передается в AbstractHttpClient?

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

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


person auramo    schedule 28.12.2010    source источник


Ответы (2)


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

person gk5885    schedule 28.12.2010
comment
Последние методы можно смоделировать с помощью Mockito ›2.1.0. См. github.com/mockito/mockito/wiki/ - person Michael Plainer; 25.05.2018

Попробуйте этот синтаксис (просто образец, а не настоящий код):

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)

person yegor256    schedule 28.12.2010
comment
Как я уже упоминал выше, насмешка над интерфейсом HttpClient работает, проблема была в конкретном классе DefaultHttpClient. В этом случае, конечно, рекомендуется издеваться над интерфейсом, а не над реализацией по умолчанию. Мне просто было любопытно, почему насмешка не работает; иногда вам придется поиздеваться над конкретными классами, и тогда эти знания могут пригодиться. - person auramo; 28.12.2010
comment
Вы по-прежнему не можете переопределить статическое создание HttpClient, если это то, что делает ваш код. то есть HttpClients.createDefault () - person RonanOD; 01.02.2016