2015-07-29 27 views
5

Bez wchodzenia w szczegóły dotyczące zalet tego sposobu, po prostu potrzebujesz pomocy w ustaleniu, dlaczego następujące kody testowe nie działają! To było więcej ćwiczeń w tym momencie ..Problem podczas korzystania z powermockito do kpiny z klasy adresu URL

Po prostu próbuję użyć PowerMockito, aby utworzyć symulację dla klasy URL i zdefiniować dla niego pewne zachowania. Oto kod:

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); 





    } 

} 

Następujący stos wyjątków jest zgłaszany. W szczególności linke 39 tego testu, czyli tam, gdzie mam: PowerMockito.when (mockURL.openConnection()). ThenReturn (mockConn); wyrzuca błąd. Pamiętaj, że adres URL jest końcową klasą i używam 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

Mam ten sam AbstractMethodError z PowerMockito i URL.openConnection(). Czy kiedykolwiek znalazłeś odpowiedź? Widziałem podobne pytanie o innym wywołaniu metody na [http://stackoverflow.com/questions/30402750/abstractmethoderror-when-calling-powermockito-mockstatic] – user823981

+0

Zrobiłem .. Jest wspomniany poniżej. Upewnij się, że uwzględniłeś klasy, które próbujesz kpić z adnotacji @PrepareForTest. –

+0

Ah, dzięki! Zapomniałem przetestować klasę w @PrepareForTest. – user823981

Odpowiedz

2

Nie jestem pewien, ale spróbuj użyć Mockito dla wyśmianie wywołanie metody. Wygląda na to, że już miałem taki problem, i myślę, że jest jakiś błąd ze strony PowerMockito.

Jak pamiętam, jeśli będziesz korzystać

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

zamiast

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

będzie działać normalnie.

lub jeśli jest źle spróbować użyć alternatywnego sposobu takiego jak

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

A jeśli niektóre z nich będą pracować, wydaje się, że powodem jest sytuacja nieobsługiwany przez PowerMockito zespołu dev. I moc mockito wywołuje prawdziwą metodę, jak również zamiast szyderczej metody.

+0

Nie sądzę, żebym mógł użyć Mockito.when (...), ponieważ URL jest końcową klasą. Ale dam drugą szansę !! –

+0

faktycznie wypróbować również pierwszą rzecz, ponieważ powermockito kpi z przedmiotów zrozumiałych dla pozorowanego obiektu mockito. Jest zintegrowany z mockito. –

+0

Bez powodzenia, próbując tego. Zostałem poinformowany, że Mockito nie może kpić/szpiegować ostatniej klasy. –

2

Cóż, to nie jest dokładnie rozwiązanie, a teraz po prostu ukończyłem inny błąd, ale przynajmniej denerwujący "AbstractMethodError" już nie istnieje.

Co zrobiłem było dodać następujące zajęcia dla adnotacji prepareClassForTest:

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

był lekko podejrzane, ale następujący po niby potwierdził, że wątpliwości: powermock puzzler

Anyways, życzyć mi szczęścia chłopaki. Drugi dzień kpiny z mojej strony, a ja jestem zmuckowany i gotowy do rzucenia piłki ...

Powiązane problemy