Sto cercando di utilizzare PowerMockito per deridere la creazione della classe java.net.URL nel mio codice che sto testando. Fondamentalmente, voglio evitare che si verifichi la vera richiesta HTTP e invece 1) controllare i dati quando viene effettuata la richiesta e 2) restituire i miei dati di test su una risposta derisoria. Questo è quello che sto cercando:Impossibile classificare la classe URL utilizzando PowerMockito/Mockito
@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);
...
}
Il codice che voglio testare assomiglia a questo:
URL wlInvokeUrl = new URL(wlInvokeUrlString);
connection = (HttpURLConnection) wlInvokeUrl.openConnection();
All'inizio della mia scenario di test ho deridere il wlInvokeUrlString per corrispondenza "MyURLString". Ho anche provato a utilizzare varie altre forme della linea whenNew, cercando di iniettare la simulazione. Non importa quello che provo, non intercetta mai il costruttore. Tutto quello che voglio fare è "intercettare" la chiamata a openConnection() e fare in modo che restituisca la mia connessione HTTP falsa invece di quella reale.
Ho deriso altre classi prima di questa nello stesso script e funzionano come previsto. O ho bisogno di un secondo paio di occhi (probabilmente vero) o c'è qualcosa di unico nella classe URL. Ho notato che se uso "whenNew (URL.class) .withAnyArguments()" e cambi "thenReturn" in "thenAnswer", potrei farlo attivare. L'unico problema è che non ottengo mai la chiamata dell'URL per il mio codice. Quello che vedo è un'invocazione del costruttore di 3 argomenti per URL.class con tutti i null per i parametri. Potrebbe essere questa classe provenire dal runtime Java e viene avviata dal test runner? Ogni aiuto è molto apprezzato.
non hai bisogno di Powermock per testare questo. Basta prendere in giro l'URL della stringa, ad esempio per utilizzare un percorso basato su file ("file: //my-test.properties"). questo funzionerà, e puoi passare i dati che ti servono –
@ JérémieB Puoi approfondire un po 'di più? Sembra una soluzione elegante e semplice, ma il codice sotto test si aspetta un HttpURLConnection e ottengo un ClassCastException se cambio la stringa URL per fare riferimento a un file (ad esempio, java.lang.ClassCastException: sun.net.www.protocol. ftp.FtpURLConnection non può essere lanciato su java.net.HttpURLConnection). Inoltre, come verificherai i parametri di input sulla richiesta utilizzando questo approccio? – Jim
Non si dovrebbe usare direttamente 'HttpURLConnection', ma' URL' e 'URLConnection'. Non c'è nulla di utile in 'HttpURLConnection'. È lo scopo di un URL per astrarre il livello di trasporto. –