如何使用 android 中的实际 HttpURLConnection 进行单元测试?

How to unit test with actual HttpURLConnection in android?

我正在编写调用 class 库的单元 tests/integration 测试,该库使用 HttpsURLConnection 对象。很多时候通过单元测试调用连接对象的方法,如 addRequestPropertysetDoOutputsetRequestMethod,我得到像 java.lang.IllegalStateException: Already connected 这样的异常。该行为很可能是由于在 gradle 中返回默认值。

testOptions {
    unitTests.returnDefaultValues = true
}

有关详细信息,请参阅 http://tools.android.com/tech-docs/unit-testing-support

相同的代码在应用程序中运行良好。有没有办法在测试时实际使用真正的 HttpsURLConnection 对象?

由于 HttpsURLConnection 是 android 的一部分,一种测试方法是使用 Android Instrumented Tests,如 http://developer.android.com/training/testing/start/index.html 所述。这将启动 AVD 或真实设备并在那里运行测试。

确保在 AndroidManifest.xml

中设置权限

<uses-permission android:name="android.permission.INTERNET"/>

您可以使用库来模拟请求和响应。我推荐这个:MockWebServer.

编辑: 重新阅读您的问题后,您似乎想在单元测试中使用 HttpsURLConnection。尝试在单元测试中使用来自 Android SDK 的 class 的问题意味着您的测试成为仪器测试,这意味着它必须 运行 在 device/emulator.

如果您想要集成仪器测试的示例,请查看this 很好的示例。

由于 HttpsURLConnection 也在 Java JDK 包中,如果您使用那个 class(导入 javax.net.ssl),您可能会更改为不使用任何 Android classes 这样你就可以 运行 你的测试作为 JVM 中的本地单元测试(而不是 device/emulator)。

如果您想更好地理解插桩单元测试和本地单元测试之间的区别,请阅读 this 博客 post。