PowerMock java.lang.ClassCastException:sun.net.www.protocol.https.HttpsURLConnectionImpl 无法转换为 javax.net.ssl.HttpsURLConnection

2024-01-08

我创建了一个模拟HttpsURLConnection基于一个堆栈交换答案 https://stackoverflow.com/a/25334710/939250:

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 仅由一个类加载器加载。由于我无法阻止使用常规类加载器,因此最好的方法是阻止 PowerMock 加载器使用@PowerMockIgnore注解。例如。

@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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PowerMock java.lang.ClassCastException:sun.net.www.protocol.https.HttpsURLConnectionImpl 无法转换为 javax.net.ssl.HttpsURLConnection 的相关文章

  • 将 Spring Data 随机(嵌入式)Mongo 端口与 NoSQL JUnit @Rule 结合使用

    我目前正在尝试编写一个使用 Spring Data Mongo 存储库的集成测试类 我使用由提供的嵌入式 Mongo 实例de flapdoodle embed mongo依赖性 Spring Data 文档指定我们只需要将这个依赖项放入项
  • Java中构造函数中的长参数列表[重复]

    这个问题在这里已经有答案了 可能的重复 重构具有太多 6 个以上 参数的方法的最佳方法是什么 https stackoverflow com questions 439574 whats the best way to refactor a
  • 在多个不同线程之间共享变量

    我想在多个线程之间共享一个变量 如下所示 boolean flag true T1 main new T1 T2 help new T2 main start help start 我想分享flag在主线程和帮助线程之间 这是我创建的两个不
  • 构建 jar 后无法运行 exe

    我制作了一个简单的实用应用程序 其中我有一个要运行的exe文件 我通过使用它来运行 Runtime getRuntime exec this getClass getResource filename exe getPath 当我从 ide
  • 在 Java 构建过程中更改常量的最佳方法

    我继承了一个在 Tomcat 下运行的 Java 应用程序 servlet 由于历史原因 根据应用程序的部署位置 本质上是品牌问题 代码具有不同的 外观和感觉 选项 有几个常量控制这个品牌过程 它们具有不同的功能 不应压缩为单个常量 即 B
  • Spring Boot“没有可用消息”错误(状态 = 404),

    我正在使用带有嵌入式 Tomcat 的 Spring Boot 当它启动时 它会登录到控制台 s w s m m a RequestMappingHandlerMapping 将 home 映射到公共 java lang String co
  • 为什么需要使用java.util.TimerTask的purge()?

    Timer cancel 取消任务 Timer purge 从此计时器的任务队列中删除所有已取消的任务 如果我不在这里使用 purge 会发生什么 当计时器的任务队列已满时会发生什么 除非您正在运行的计时器数量过多 否则实际计时器行为不会发
  • 确定范围是否重叠

    给定两个具有整数开始时间和结束时间的事件 E1 s1 e1 E2 s2 e2 实现快速布尔检查以查看事件是否重叠 我有解决方案 但我很想看看其他人想出了什么 编辑 好的 这是我的解决方案 e1 gt s2 s1 gt s2 e2 lt s1
  • getAnnotations() 为空

    我想在我的应用程序中使用注释 因此 我为注释创建了 hello world 如下示例 public class HelloAnnotation Foo bar Hello World public String str public sta
  • Android - Firebase - 保存新数据而不覆盖旧数据

    创建此问题是因为我之前的问题包含 2 个问题 而不是将其缩小到 1 Aim 用户将能够存储新数据而不会覆盖之前提交的数据 描述 目前 当用户输入新报告时 事件报告节点中的用户事件报告数据将被覆盖 用户发送的旧事件报告中的数据应与新数据一起保
  • JAXB、Marshal 的问题 - 无法封送类型“java.lang.String”

    当我运行 marshal 操作时 出现以下错误 javax xml bind MarshalException with linked exception com sun istack internal SAXException2 unab
  • MySQL 中电话号码的最佳数据类型是什么?它的 Java 类型映射应该是什么?

    我正在将 MySQL 与 Spring JDBC 模板一起用于我的 Web 应用程序 我需要存储仅包含数字的电话号码 10 我对使用数据类型的数据类型有点困惑 MySQL 中最适合它的数据类型是什么 为此 Bean POJO 类中的 Jav
  • 使用 python 中的 java 库

    我有一个 python 应用程序和 java 应用程序 python 应用程序为 java 应用程序生成输入并在命令行上调用它 我确信一定有一个更优雅的解决方案 就像使用 JNI 从 Java 调用 C 代码一样 有什么指点吗 仅供参考 我
  • 关于 mongodb java 驱动程序的困惑[重复]

    这个问题在这里已经有答案了 我是 MongoDB 的初学者 我正在使用 JAVA 驱动程序来使用它 我有以下代码 MongoClient client new MongoClient DB d client getDB world DBCo
  • 带有 CONTAINS 查询的PreparedStatement

    我有一个查询需要连续运行 28000 次 所以我认为使用准备好的语句可能是一个聪明的主意 这是我的查询 String requestWithFirstName SELECT SE ELEMENT ID SE LASTNAME SE FIRS
  • 如何找到类路径上具有特定方法注释的所有类?

    我想在Java中实现一个基于注释的初始化机制 具体来说 我定义了一个注释 Retention RetentionPolicy RUNTIME Target ElementType METHOD public interface Initia
  • 如何将捕获的图像写入/粘贴到文档文件?

    我有一个场景 我需要捕获图像并将它们一个接一个地写入到一个word文件中 我已经编写了下面的代码 但似乎不起作用 请帮忙 Robot robot try robot new Robot BufferedImage screenShot ro
  • java POI XSSF 公式评估器

    我在保存新的 Excel 文件时遇到问题 我希望当它被保存时 公式会自行计算 但目前它只是返回 Excel 文件中的一个字符串 公式是正确的 我不知道到底要得到FormulaEvaluator上班 这是我输入返回字符串的公式的地方 data
  • java:验证 GUI 中的所有文本字段是否已完成

    我正在尝试创建一个允许某人设置帐户的 GUI 我想验证按下创建帐户按钮时所有文本字段是否完整 做这个的最好方式是什么 我正在附加我的代码 但我对文本字段是否完整的验证不起作用 参见下面的代码 public class GUIaccounts
  • ByteBuddy 变基、合成类型和 OSGi

    我为 byte buddy 开发了以下拦截器 public class SecurityInterceptor RuntimeType public static Object intercept SuperCall Callable su

随机推荐

  • GCP:警报触发时是否可以触发云功能?

    我正在使用谷歌云平台的谷歌云监控 我为我监控的对象创建了一些警报策略 但是 当有警报触发时 有些信息未包含在我希望包含在电子邮件中的信息中 因此 我正在考虑使用云功能 如果在这种情况下可以的话 该功能将触发我创建的策略之一 如果可能的话 请
  • TypeError:不支持的操作数类型 -:python 3.x Anaconda 中的“str”和“str”

    我正在尝试在大型数据集中每小时计算一些实例 下面的代码似乎在 python 2 7 上运行良好 但我必须将其升级到 3 x 最新版本的 python 并在 Anaconda 上更新所有包 当我尝试执行该程序时 我正在跟踪str error
  • MySQL 有没有办法隐式地为表创建主键?

    在MySQL中 当CREATE TABLE时 MySQL是否有办法隐式创建一个列 即CREATE TABLE命令中未显式声明的列 作为表的主键 Thanks 不 需要在表上定义主键 您可能正在考虑this https dev mysql c
  • Rails - 如何向用 javascript 创建的表单添加 CSRF 保护?

    我正在使用backbone js 它效果很好 但我作为 JavaScript 模板创建的表单缺少 Rails csrf 保护令牌 如何将其添加到我用 JavaScript 创建的模板中 我解决这个问题的最好方法是在表单中 Update 它看
  • JQuery 验证多个字段并出现一个错误

    我将如何使用 JQuery Validate 插件为 3 个字段提供一条错误消息 例如 3 个 dob 字段 默认情况下 如果所有 3 个字段都留空 我将收到 3 条错误消息 我只想将一个错误链接到 3 个字段 如果有空白 则会出现错误 类
  • 自动调整 SVG 大小?

    这里有一个代码演示 http jsfiddle net y59MR 1 我有一个高度未知的 SVG 我可以在加载 json 并使用 javascript math 后弄清楚它 但是有没有可以使用的 css 来动态调整它的大小 css svg
  • UTF-8 与 Latin1 mysql,UTF-8 上未使用索引

    我尝试使用 UTF 8 和 Latin1 字符集创建 mysql 表 当我使用 Latin1 时 会使用索引 而当我使用 UTF 8 时 选择 限制记录时不会使用索引 我的字符集是否缺少某些内容导致发生这种情况 Cheers Ke 仅当表达
  • .gitattributes 中没有扩展名的文件

    我正在尝试处理 gitattributes 中没有扩展名的文件 text auto eol lf py eol lf 显然没有帮助 git check attr all foo输出 foo 文本 自动 如何才能做到这一点 我认为您必须为所有
  • 迭代 CSV 文件中的列 (PHP)

    我需要编写一个函数 以年份和温度作为输入 并返回给定年份中温度等于或低于给定温度的天数 由于数据是关于小时而不是天 因此需要找到小时数并将其除以 24 示例 getDaysUnderTemp 2019 10 返回 13 92 CSV 文件如
  • ng2-smart-table 缺少依赖项完成程序

    我正在使用 Ng2SmartTable 并且出现此错误 目标入口点 ng2 smart table 丢失时出现错误 依赖项 akveo ng2 completer 我已经尝试过以下命令 但它不起作用 1 npm install save n
  • 在 C++ 中分配和使用无类型内存块的正确方法是什么?

    到目前为止 我对这个问题得到的答案有两种完全相反的答案 它是安全的 和 它是未定义的行为 我决定完全重写这个问题 以便为我和任何可能通过谷歌到达这里的人获得一些更好的澄清答案 另外 我删除了C标签 现在这个问题是 C 特定的 我正在制作一个
  • chrome.storage.sync.set 不保存值

    因此 我在 Google Chrome 上的本地存储方面遇到了一些障碍 根据我的研究 我的语法似乎是正确的 但由于某种原因该值没有被保存 这是我的代码 chrome storage sync get accName function dat
  • 如何手动将 dns 条目添加到由 AWS ECS 服务发现管理的托管区域?

    我正在 AWS ECS 中的私有托管区域中使用容器服务发现staging example com 现在 在容器旁边 我想将 AWS RDS 数据库映射到db staging example com 但是 我无法修改 Route53 托管区域
  • 如何使用 Android Studio 2.2.3 调试外部本机库的 C++ 源代码?

    我有一个在Windows 10下由Android Studio 2 2 3创建的android项目 该项目通过其包装jar 通过JNI 使用本机库 本机库是由 qmake 在 Android Studio 之外构建的 它将使用 androi
  • 如何将文本文件转换为ARFF格式?

    我正在使用 WEKA 工具进行文本分类 并且必须将纯文本文件转换为 ARFF 格式 但是 我不知道该怎么做 谁能帮我将文本文件转换为 ARFF 格式 谢谢伦克劳夫的回复 我不明白这些要点 由于像记事本这样的文本编辑器只允许有限数量的列 因此
  • 错误:‘$’未定义。[no-undef]

    我想用一些 jQuery 来做一个粘性导航栏但我得到了错误 ERROR is not defined no undef ERROR document is not defined no undef 并且代码不起作用 有人可以帮助我为什么会出
  • 我可以在不使用好友的情况下从班级外部访问私人成员吗?

    免责声明 是的 我完全意识到我所问的问题是完全愚蠢的 任何希望在生产代码中尝试这样的事情的人都应该被解雇和 或枪杀 我主要是想看看是否can做完了 现在这已经不成问题了 有什么方法可以从类外部访问 C 中的私有类成员吗 例如 有什么方法可以
  • 解析 JSON 数组并加载到 hive 表中

    我有一个如下所示的 Json 数组 Name xxxx Machine Machine1 Name yyyy Machine Machine2 Name zzzz Machine Machine3 我需要解析该数据并加载到如下所示的配置单元
  • 循环内分配内存与循环外分配内存

    在循环的每次迭代中分配大块堆内存是否会带来明显的性能损失 当然 我在每次迭代结束时释放它 另一种方法是在进入循环之前分配一次 在所有迭代中重复使用它 并最终在退出循环后释放它 请参阅下面的代码 allocation inside loop
  • PowerMock java.lang.ClassCastException:sun.net.www.protocol.https.HttpsURLConnectionImpl 无法转换为 javax.net.ssl.HttpsURLConnection

    我创建了一个模拟HttpsURLConnection基于一个堆栈交换答案 https stackoverflow com a 25334710 939250 import java net URL import javax net ssl