2010-12-28 5 views
9

Ich hatte ein Problem mit Mocking Apache Http-Client. Der folgende Versuch, einen Mock zu erstellen:Warum verwendet mein Mockito Mock-Objekt real die Implementierung

Fehler beim Erstellen eines echten Schein. Die obige Zeile wird ohne Ausnahmen ausgeführt, aber wenn ich versuche, ein bestimmtes Verhalten Stummel:

Mockito.when(httpClient.execute(Mockito.<HttpUriRequest>anyObject())).thenReturn(null); 

Ich erhalte eine Ausnahme von einer Methode in 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) 

Warum der Anruf innerhalb Mockito auszuführen ist. wenn an AbstractHttpClient übergeben?

Ich habe eine Lösung für dieses spezielle Problem gefunden: Verwenden Sie die Schnittstelle HttpClient, anstatt zu versuchen, die konkrete Unterklasse zu verhöhnen. Dies ist eine viel bessere Lösung in diesem Fall, aber ich frage mich allgemein, was hier vor sich geht? Warum kann ich diese konkrete Klasse nicht richtig mit Mockito verspotten? Gibt es etwas Besonderes an DefaultHttpClient? Gibt es andere Fälle, wo Mockito konkrete Klassen nicht verspotten kann?

Ich bin mit Mockito 1.8.5, Apache Httpclient 4.0.3, Apache HTTP-Kern 4.1, JDK 1.6.0 auf OSX

Antwort

15

Einige der Methoden auf AbstractHttpClient endgültig sind und somit nicht verspottet werden. IMO, dieses Verhalten ist der Grund # 1, konkrete Klassen nicht zu verspotten.

+0

Das war's, danke! – auramo

3

Versuchen Sie, diese Syntax (nur ein Beispiel, kein richtiger Code):

import static Mockito.*; 
// ... 
HttpClient httpClient = mock(HttpClient.class); 
doReturn(null).when(httpClient).execute(anyObject()). 

Siehe diesen Link für eine bessere Erklärung des Problems/Lösung: http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#doReturn(java.lang.Object)

+0

Wie bereits erwähnt, funktioniert das Problem mit der konkreten Klasse DefaultHttpClient, die gegen die HttpClient-Schnittstelle spottet. In diesem Fall ist es natürlich empfehlenswert, sich über die Schnittstelle und nicht über die Standardimplementierung lustig zu machen. Ich war nur neugierig, warum das Spotten nicht funktioniert hat; Manchmal musst du gegen konkrete Klassen spotten und dann kann dieses Wissen nützlich werden. – auramo

+0

Sie können die statische Erstellung von HttpClient immer noch nicht überschreiben, wenn dies Ihrem Code entspricht. htpClients.createDefault() – RonanOD

Verwandte Themen