如何对 Android ConnectivityManager 进行单元测试
Posted
技术标签:
【中文标题】如何对 Android ConnectivityManager 进行单元测试【英文标题】:How to unit test 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
【问题讨论】:
【参考方案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 的?我也一样。以上是关于如何对 Android ConnectivityManager 进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章
如何对 Android 中的 Activity 强制执行自定义权限?