6

この方法の利点の詳細には立ち入らずに、次のテスト コードが機能しない理由を理解するための助けが必要です! これは、この時点でより多くの学習演習でした..

PowerMockito を使用して URL クラスのモックを作成し、その動作を定義しようとしています。コードは次のとおりです。

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





    }

}

次の例外スタックがスローされます。特に、このテストのリンク 39 は、次の場所にあります。エラーをスローします。URL は最終クラスであり、私は 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)
4

3 に答える 3

5

これは正確な解決策ではなく、別のエラーを卒業しただけですが、少なくとも迷惑な「AbstractMethodError」はなくなりました。

私がしたことは、prepareClassForTest アノテーションに次のクラスを追加することでした。

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

少し疑わしいですが、次の投稿はその疑いを裏付けるものでした: powermock puzzler

とにかく、幸運を祈ります。2日目は自分のやり方を嘲笑し、私はすべてめちゃくちゃになり、ボールを落とす準備ができています...

于 2015-07-29T13:48:36.247 に答える
2

よくわかりませんが、メソッド呼び出しのモックには Mockito を使用してみてください。私はすでにそのような問題を抱えているようで、PowerMockito 側に何らかのバグがあると思います。

あなたが使用するかどうか私が覚えているように

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

それ以外の

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

正常に動作します。

または、間違っている場合は、次のような代替方法を使用してみてください

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

これらのいくつかが機能する場合、その理由は PowerMockito 開発チームが未処理の状況にあるようです。そして、モック化されたメソッドと同様に、またはモック化されたメソッドの代わりに、実際のメソッドを呼び出します。

于 2015-07-29T13:36:13.890 に答える