У меня возникла проблема с издевательством клиента 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