首页 / JAVA / PowerMock java.lang.ClassCastException:sun.net.www.protocol.https.HttpsURLConnectionImpl无法强制转换为javax
PowerMock java.lang.ClassCastException:sun.net.www.protocol.https.HttpsURLConnectionImpl无法强制转换为javax
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了PowerMock java.lang.ClassCastException:sun.net.www.protocol.https.HttpsURLConnectionImpl无法强制转换为javax,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3063字,纯文字阅读大概需要5分钟。
内容图文
我创建了一个基于StackExchange answer的模拟HttpsURLConnection:
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
...
@RunWith(PowerMockRunner.class)
public class DialogTest {
public void mockHttpsUrlConnectionExample() throws Exception
{
URL mockUrl = PowerMockito.mock(URL.class);
PowerMockito.whenNew(URL.class).withAnyArguments().thenReturn(mockUrl);
HttpsURLConnection mockUrlConnection = PowerMockito.mock(HttpsURLConnection.class);
PowerMockito.when(mockUrl.openConnection()).thenReturn(mockUrlConnection);
PowerMockito.when(mockUrlConnection.getResponseCode()).thenReturn(200);
// Create and call my objects ...
}
}
但是,当我使用它时,我看到一个强制转换异常:
java.lang.ClassCastException: sun.net.www.protocol.https.HttpsURLConnectionImpl cannot be cast to javax.net.ssl.HttpsURLConnection
问题出在这个代码中:
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
...
private Boolean sendRequest(String endpoint, JSONObject requestData, Boolean throwOnAuthException) throws JSONException, IOException {
this.responseData = null;
try {
String serviceURI = getServiceURI();
String dialogUri = String.format("%s%s", serviceURI, endpoint);
URL url = new URL(dialogUri);
// Exception source is this cast
HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
但是,当我查看源代码时,我看到sun.net.www.protocol.https.HttpsURLConnectionImpl实现了javax.net.ssl.HttpsURLConnection
有关如何解决此问题的任何建议?
解决方法:
普通类加载器和PowerMock之间的冲突问题
PowerMock的缺点是使用自定义类加载器.此类加载器可以以与默认类加载器不兼容的方式修改类型签名.
在某些情况下,通过反射进行实例化将导致使用默认类加载器来加载类型.由于使用了不同的签名,该类加载器不会知道PowerMock已经加载了一个类型.结果可能是错误
应该实现强制类型的对象.
要避免此问题,请首先停止PowerMock加载javax.net.ssl.HttpsURLConnection
要防止强制转换异常,请确保javax.net.ssl.HttpsURLConnection仅由一个类加载器加载.由于我无法停止使用常规类加载器,因此最好的方法是使用@PowerMockIgnore注释停止PowerMock加载器.例如.
@PowerMockIgnore({"javax.net.ssl.*"})
@PrepareForTest(android.util.Log.class)
public class DialogTest {
...
副作用是PowerMock不再能够提供它的HttpsURLConnection版本
接下来,公开HttpsURLConnection构造,并替换模拟对象
为HttpsURLConnection引入工厂.例如.
public class HttpsUrlConnectionProvider {
public HttpsURLConnection getHttpsURLConnection(String dialogUri) throws IOException {
URL url = new URL(dialogUri);
return (HttpsURLConnection) url.openConnection();
}
}
创建用于HTTP请求的HttpsURLConnection对象的模拟.
final HttpsURLConnection mockUrlConnection = PowerMockito.mock(HttpsURLConnection.class);
PowerMockito.when(mockUrlConnection, "getResponseCode").thenReturn(200);
PowerMockito.when(mockUrlConnection, "getOutputStream").thenReturn(outputStream);
// Replace the HttpsURLConnection factory with one that returns our mock HttpsURLConnection
HttpsUrlConnectionProvider mockConnFactory = new HttpsUrlConnectionProvider() {
public HttpsURLConnection getHttpsURLConnection(String dialogUri) throws
IOException {
return mockUrlConnection;
}
};
dialog.setHttpsUrlConnectionProvider(mockConnFactory);
内容总结
以上是互联网集市为您收集整理的PowerMock java.lang.ClassCastException:sun.net.www.protocol.https.HttpsURLConnectionImpl无法强制转换为javax全部内容,希望文章能够帮你解决PowerMock java.lang.ClassCastException:sun.net.www.protocol.https.HttpsURLConnectionImpl无法强制转换为javax所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。