最終クラス ( 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");
}
}
ご覧のとおり、ここで達成しようとしているのは、(非常に) 単純なテスト ワークフローを実行することだけです。
- モックの定義 (mockURL)
- メソッドスタブの定義
getUserInfo
- メソッドのテスト:
testClass.returnUserInfo()
残念ながら、テスト中のクラス (テスト中のシステムまたは SUT とも呼ばれます):ClassToTest
では、実行時に url.getUserInfo()
空の文字列が返されます。ここで起こっていることは、@Test
メソッドでコンストラクターとして渡された mockURL オブジェクトが永続化されていないことです。代わりに、クラスローダは URL の新しいインスタンスを SUT にロードします。どちらも得られないので、これがそうであると信じさせられNullPointerException
ます!私が得るのは、userInfo
そうでなければ「apil.tamang」と言うべき空の文字列だけです。
また、.java 拡張子で記述された同じファイルは期待どおりに機能します。つまり、同じClassToTestTester
パスを実行しています。
ここで何が間違っていますか?私が見逃している露骨なエラーはありますか??