Senza entrare nei dettagli del merito di fare in questo modo, solo bisogno di aiuto a capire perché i seguenti codici di test non funzionano! Questo è stato più di un esercizio di apprendimento a questo punto ..problema durante l'utilizzo di powermockito per deridere la classe URL
Solo cercando di usare PowerMockito per creare un mock per la classe URL, e definire alcuni comportamenti per esso. Ecco il codice:
package com.icidigital.services
import com.icidigital.services.impl.WeatherServiceImpl
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.powermock.api.mockito.PowerMockito
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.PowerMockRunner
/**
* Created by apil.tamang on 7/27/15.
* I could not get the setup to finish! Failed!
*/
@PrepareForTest(URL.class)
@RunWith(PowerMockRunner.class)
class WeatherServiceImplTest {
URL mockURL;
URLConnection mockConn;
@Before
public void setUp(){
byte[] data = "123,456".getBytes();
InputStream input = new ByteArrayInputStream(data);
//define and set behavior for mockConn
mockConn=PowerMockito.mock(HttpURLConnection.class);
//Mockito.doCallRealMethod().when(mockConn).getResponseCode();
//Mockito.when(mockConn.getResponseCode()).thenCallRealMethod().thenReturn(200);
//Mockito.when(mockConn.getInputStream()).thenReturn(input);
//define and set behavior for mockURLObj
mockURL=PowerMockito.mock(URL.class);
PowerMockito.when(mockURL.openConnection()).thenReturn(mockConn);
}
@Test
public void testSetup(){
WeatherServiceImpl testObj=new WeatherServiceImpl(mockURL);
String response=testObj.run("foobar");
PowerMockito.verifyNew(mockURL);
}
}
Il seguente stack di eccezioni viene generato. In particolare, linke 39 di questo test, che è dove ho: PowerMockito.when (mockURL.openConnection()). ThenReturn (mockConn); lancia l'errore Tenete presente che l'URL è una classe finale, e che sto usando Powermockito.
java.lang.AbstractMethodError
at java.net.URL.openConnection(URL.java:971)
at java_net_URL$openConnection.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112)
at com.icidigital.services.WeatherServiceImplTest.setUp(WeatherServiceImplTest.groovy:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.internal.runners.MethodRoadie.runBefores(MethodRoadie.java:129)
at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:93)
Sto avendo lo stesso AbstractMethodError con PowerMockito e URL.openConnection(). Hai mai trovato una risposta? Ho visto una domanda simile su una chiamata di metodo diverso su [http://stackoverflow.com/questions/30402750/abstractmethoderror-when-calling-powermockito-mockstatic] – user823981
che ho fatto .. È menzionato di seguito. Assicurati di includere le classi che stai cercando di simulare nell'annotazione @PrepareForTest. –
Ah, grazie! Mi ero dimenticato di mettere la classe sotto test in @PrepareForTest. – user823981