0

最終クラス ( java.net.URL) をモックし、それを非常に単純な Wrapper クラス ClassToTest.groovy で使用しようとしています。テスター クラスはさらに下に示され、ClassToTestTester.groovy です。

package com.icidigital.services.impl;

import java.net.HttpURLConnection;
import java.net.URL;

/**
 * Created by apil.tamang on 7/29/15.
 */
public class ClassToTest {

    private URL url;

    public ClassToTest(URL obj){

        this.url=obj;
    }

    public String returnUserInfo() throws Exception{


        String userInfo=url.getUserInfo();
        println("Got user info: "+userInfo);
        return userInfo;
    }
}


package com.icidigital.services;

import static org.junit.Assert.*;

import com.icidigital.services.impl.ClassToTest;
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;


@RunWith(PowerMockRunner.class)
@PrepareForTest([ URL.class, HttpURLConnection.class, ClassToTest.class ])
public class ClassToTestTester {

    @Test
    public void setUp() throws Exception{
        //========================================
        //define a mock url instance
        URL mockURL=PowerMockito.mock(URL.class);

        //define behavior for openConnection method
        PowerMockito.doReturn("apil.tamang").when(mockURL).getUserInfo();

        //========================================
        //setup a test class
        ClassToTest testClass=new ClassToTest(mockURL);

        /*call the method to test in testtClass
         *Throws exception: AbstractMethodError, why??
         *
         * URL.openConnection() is NOT an abstract method, besides
         * I've defined a stub for  'mockURL' to return
         * 'mockConn' when its openConnection() method is called.
         */
        String result=testClass.returnUserInfo();

        assertEquals(result,"apil.tamang");
    }

}

ご覧のとおり、ここで達成しようとしているのは、(非常に) 単純なテスト ワークフローを実行することだけです。

  1. モックの定義 (mockURL)
  2. メソッドスタブの定義getUserInfo
  3. メソッドのテスト:testClass.returnUserInfo()

残念ながら、テスト中のクラス (テスト中のシステムまたは SUT とも呼ばれます):ClassToTestでは、実行時に url.getUserInfo()空の文字列が返されます。ここで起こっていることは、@Testメソッドでコンストラクターとして渡された mockURL オブジェクトが永続化されていないことです。代わりに、クラスローダは URL の新しいインスタンスを SUT にロードします。どちらも得られないので、これがそうであると信じさせられNullPointerExceptionます!私が得るのは、userInfoそうでなければ「apil.tamang」と言うべき空の文字列だけです。

また、.java 拡張子で記述された同じファイルは期待どおりに機能します。つまり、同じClassToTestTesterパスを実行しています。

ここで何が間違っていますか?私が見逃している露骨なエラーはありますか??

4

0 に答える 0