如何使用 android 中的实际 HttpURLConnection 进行单元测试?
How to unit test with actual HttpURLConnection in android?
我正在编写调用 class 库的单元 tests/integration 测试,该库使用 HttpsURLConnection
对象。很多时候通过单元测试调用连接对象的方法,如 addRequestProperty
、setDoOutput
、setRequestMethod
,我得到像 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。
我正在编写调用 class 库的单元 tests/integration 测试,该库使用 HttpsURLConnection
对象。很多时候通过单元测试调用连接对象的方法,如 addRequestProperty
、setDoOutput
、setRequestMethod
,我得到像 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。