常规类加载器和 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);