【问题标题】:How to unit test Android ConnectivityManager如何对 Android ConnectivityManager 进行单元测试
【发布时间】:2020-09-25 08:39:44
【问题描述】:

我正在构建一个应用程序,通过它我们可以使用 ConnectivityManager 类检测互联网连接的可用性,但我不确定如何使用 Mockito 添加单元测试。请帮我编写以下代码的单元测试用例:

class ConnectivityMgr @Inject constructor(val context: Context) {
    fun isConnectedOrConnecting(): Boolean {
        val connMgr = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            connMgr.getNetworkCapabilities(connMgr.activeNetwork)?.run {
                return hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || hasTransport(
                    NetworkCapabilities.TRANSPORT_CELLULAR
                )
            }
        } else {
            @Suppress("DEPRECATION")
            connMgr.activeNetworkInfo?.let {
                return when (it.type) {
                    ConnectivityManager.TYPE_WIFI -> true
                    ConnectivityManager.TYPE_MOBILE -> true
                    else -> false
                }
            }
        }
        return false
    }
}

【问题讨论】:

    标签: android unit-testing junit mockito android-connectivitymanager


    【解决方案1】:

    您可以使用 Roboelectric 测试您的 ConnectivityMgr 课程。设备连接到 WiFi 时的示例测试如下:

    fun `should be connected when connected to WiFi`() {
        val connectivityManager = getApplicationContext<Context>().getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    
        val networkCapabilities = ShadowNetworkCapabilities.newInstance()
        shadowOf(networkCapabilities).addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        shadowOf(connectivityManager).setNetworkCapabilities(connectivityManager.activeNetwork, networkCapabilities)
    
        assertTrue(connectivityMgr.isConnectedOrConnecting())
    }
    

    Roboelectric 提供ShadowNetworkCapabilities 用于获取和更新传输。

    【讨论】:

    • 感谢 Saurabh,但这样做我得到以下异常: java.lang.ClassCastException: java.lang.Object cannot be cast to org.robolectric.shadows.ShadowNetworkCapabilities
    • 也许尝试用@Config(sdk = [Build.VERSION_CODES.Q])注释你的测试方法
    • 我尝试了以下方法,但断言总是返回 false。 @Test @Config(sdk = [Build.VERSION_CODES.P])
    • 我错过了上下文。感谢 Saurabh 的帮助。
    • @Adhish 你是如何解决那个 classCastException 的?我也一样。
    猜你喜欢
    • 2022-11-17
    • 1970-01-01
    • 2012-01-08
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多