Ich versuche PowerMockito zu verwenden, um die Erstellung der Klasse java.net.URL in meinem Code, den ich gerade teste, zu verspotten. Im Grunde möchte ich verhindern, dass die echte HTTP-Anfrage auftritt, und stattdessen 1) die Daten überprüfen, wenn die Anfrage gemacht wird, und 2) meine eigenen Testdaten mit einer verspotteten Antwort zurückliefern. Das ist, was ich versuche:URL kann nicht mit PowerMockito/Mockito simuliert werden
@RunWith(PowerMockRunner.class)
@PrepareForTest({ URL.class, MockedHttpConnection.class })
public class Test {
URL mockedURL = PowerMockito.mock(URL.class);
MockedHttpConnection mockedConnection = PowerMockito.mock(MockedHttpConnection.class);
...
PowerMockito.whenNew(URL.class).withParameterTypes(String.class).withArguments("MyURLString").thenReturn(mockedURL);
PowerMockito.when(mockedURL.openConnection()).thenReturn(mockedConnection);
...
}
Der Code, den ich wie folgt aussieht testen will:
URL wlInvokeUrl = new URL(wlInvokeUrlString);
connection = (HttpURLConnection) wlInvokeUrl.openConnection();
Früher in meinem Testszenario verspotten ich das wlInvokeUrlString „MyURLString“ entsprechen. Ich habe auch versucht, verschiedene andere Formen der whenNew-Linie zu verwenden, versuchend, den Schein zu injizieren. Egal was ich versuche, es fängt niemals den Konstruktor ab. Alles, was ich tun will, ist, den Aufruf von openConnection() zu fangen und meine gespottete HTTP-Verbindung anstelle der echten zurückgeben zu lassen.
Ich habe andere Klassen vor diesem im selben Skript verspottet und diese funktionieren wie erwartet. Entweder brauche ich ein zweites Augenpaar (wahrscheinlich wahr) oder es gibt etwas Einzigartiges an der URL-Klasse. Ich habe bemerkt, dass ich, wenn ich "whenNew (URL.class) .withAnyArguments()" benutze und den "thenReturn" in "thenAnswer" ändere, es auslösen könnte. Das einzige Problem ist, dass ich nie den URL-Aufruf für meinen Code bekomme. Was ich sehe, ist ein Aufruf des 3-Argument-Konstruktors für URL.class mit allen Nullen für die Parameter. Könnte es sein, dass diese Klasse von der Java Runtime stammt und vom Test Runner bootstrapped wird? Jede Hilfe wird sehr geschätzt.
Sie benötigen keinen Powermock, um dies zu testen. Spotten Sie einfach die String-URL, um beispielsweise einen dateibasierten Pfad zu verwenden ("file: //my-test.properties"). Das funktioniert, und Sie können die Daten weitergeben, die Sie benötigen. –
@ JérémieB Können Sie das etwas genauer ausführen? Dies scheint eine elegante und einfache Lösung zu sein, aber der getestete Code erwartet eine HttpURLConnection und ich erhalte eine ClassCastException, wenn ich die URL-Zeichenfolge ändere, um auf eine Datei zu verweisen (zB java.lang.ClassCastException: sun.net.www.protocol. ftp.FtpURLConnection kann nicht in java.net.HttpURLConnection umgewandelt werden. Wie würden Sie die Eingabeparameter für die Anfrage mithilfe dieses Ansatzes überprüfen? – Jim
Sie sollten nicht direkt 'HttpURLConnection', sondern' URL' und 'URLConnection' verwenden. Es gibt nichts nützliches in 'HttpURLConnection'. Es ist der Zweck einer URL, die Transportschicht zu abstrahieren. –