首页 > 解决方案 > 在 Android Instrumented 测试中模拟无 Internet 连接/慢速 Internet 连接

问题描述

我正在编写一个库,它会持续检查 android 设备的连接,并在设备连接、断开连接或互联网连接变慢时给出回调。

https://github.com/muddassir235/connection_checker

我想为这个库编写 Android Instrumentated 测试,我需要模拟没有互联网连接以及缓慢的互联网连接。

package com.muddassir.connection_checker

import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4

import org.junit.Test
import org.junit.runner.RunWith

import org.junit.Assert.*

/**
 * Instrumented test, which will execute on an Android device.
 *
 * See [testing documentation](http://d.android.com/tools/testing).
 */
@RunWith(AndroidJUnit4::class)
class ConnectionCheckerTest {
    @Test
    fun checkDisconnectedState() {
        val context = InstrumentationRegistry.getInstrumentation().targetContext
        InstrumentationRegistry.getInstrumentation().runOnMainSync {
            val connectionChecker = ConnectionChecker(context, null)
            connectionChecker.connectivityListener = object: ConnectivityListener {
                override fun onConnected() {
                    assertTrue(false)
                }

                override fun onDisconnected() {
                    assertTrue(true)
                }

                override fun onConnectionSlow() {
                    assertTrue(false)
                }
            }

            // Disconnect from the internet. How do I do this?

            connectionChecker.startChecking()
        }

        Thread.sleep(30000)
    }
}

标签: androidkotlintestingconnectioninstrumented-test

解决方案


Retrofit 有一个retrofit-mock模块,它提供了一个 MockRestAdapter 类,其目的是模拟网络延迟和错误。

这是一个与普通 RestAdapter 一起使用来创建你的服务的实例。您可以在存储库的 samples/mock-github-client/ 文件夹中查看完整示例:https ://github.com/square/retrofit/blob/master/retrofit-mock/src/test/java/retrofit2/mock /MockRetrofitTest.java

MockRestAdapter 提供以下 API:

setDelay- 设置网络往返延迟,以毫秒为单位。 setVariancePercentage- 设置网络往返延迟的正负方差百分比。 setErrorPercentage- 设置calculateIsFailure()返回 true 的调用百分比。在你的测试中,你可以打电话setErrorPercentage(100)保证会发生网络错误。默认情况下,抛出错误的时间是延迟的 0 到 3 倍。


推荐阅读