2015-07-29 14 views
5

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) 
+0

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

+0

che ho fatto .. È menzionato di seguito. Assicurati di includere le classi che stai cercando di simulare nell'annotazione @PrepareForTest. –

+0

Ah, grazie! Mi ero dimenticato di mettere la classe sotto test in @PrepareForTest. – user823981

risposta

2

io non sono davvero sicuro, ma tenta di utilizzare Mockito per beffardo la chiamata al metodo. Sembra che abbia già avuto questo problema e penso che ci sia qualche problema da parte di PowerMockito.

Per quanto mi ricordo se si utilizzerà

Mockito.when(mockURL.openConnection()).thenReturn(mockConn); 

invece di

PowerMockito.when(mockURL.openConnection()).thenReturn(mockConn); 

che funzionerà normalmente.

o se è sbagliato Cercare di usare modo alternativo come

Mockito/PowerMockito.doReturn(mockConn).when(mockUrl).openConnection(); 

E se alcuni di questi funziona, sembra che il motivo è la situazione gestita da PowerMockito team di sviluppo. E il potere mockito invoca il metodo reale come o al posto del metodo deriso.

+0

Non penso di poter usare Mockito.quando (...) poiché l'URL è una classe finale. Ma darò un secondo colpo alla seconda !! –

+0

in realtà prova anche la prima cosa, perché powermockito prende in giro gli oggetti comprensibili per l'oggetto mockito mockito. È integrato con il mockito. –

+0

Non ho fortuna a provarlo. Mi viene detto che Mockito non può prendere in giro/spiare una lezione finale. –

2

Bene, questa non è esattamente una soluzione, e mi sono semplicemente laureato con un errore diverso ora, ma almeno il fastidioso "AbstractMethodError" è scomparso.

Quello che ho fatto è stato quello di aggiungere le seguenti classi per l'annotazione prepareClassForTest:

.... 
@PrepareForTest({URL.class, URLConnection.class, WeatherServiceImplTest.class}) 
... 

è stata lievemente sospetto, ma il seguente tipo carica di affermato che dubbio: powermock puzzler

In ogni modo, mi auguro fortuna ragazzi. Il secondo giorno di prendermi in giro e sono tutto matto e pronto a far cadere la palla ...

Problemi correlati