我正在尝试模拟最终类 ( 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
通行证。
我在这里做错了什么?我错过了一个明显的错误吗?