我正在尝试编写用于包含WorkManager WorkRequests的类的Android检测测试。
很长一段时间里,我一直卡在这个点上:我可以看到工作者被排队了,但它们从未被执行。经过一些时间和试错,我意识到以下限制正在阻止测试:
...
setConstraints(Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build())
...
如果我移除这个限制,工作项就能按预期执行。
我的虚拟设备有网络连接,所以不确定为什么在我的测试中没有满足这个限制。
有没有人有关于如何修复这个问题的建议,因为我需要编写覆盖满足和不满足这个限制情况的测试。
我的工作请求非常简单,但是在这里:
val workRequest = OneTimeWorkRequestBuilder<T>()
.addTag(syncWork.getSyncType().name)
.setConstraints(Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build())
.build()
syncWorkRepository.save(syncWork.apply { id = workRequest.id.toString() })
workManager.enqueue(workRequest)
我已经尝试过:
val wifi = context.getSystemService(Context.WIFI_SERVICE) as WifiManager
wifi.isWifiEnabled = true
但是这会抛出一个安全异常:
SecurityException: WifiService: Neither user 10139 nor current process has android.permission.CHANGE_WIFI_STATE.
我也在我的测试中添加了代码来检查网络状态:
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val activeNetwork: NetworkInfo? = cm.activeNetworkInfo
val isConnected: Boolean = activeNetwork?.isConnected == true
即使isConnected为true,但WorkManager约束条件仍未满足,因此工作不会被执行。
还尝试过:
val testDriver = getTestDriver()
使用
testDriver?.setAllConstraintsMet(workInfo.id)
在我的“根据标签观察LiveData”方法中,我可以看到它被执行一次以获取ENQUEUED状态。
这是我的测试观察者:
syncManager.syncWork(SyncType.ALL)
.observe(lifecycleOwner, Observer { listOfWorkInfo ->
listOfWorkInfo.forEach { workInfo ->
Log.d("TAG", "${workInfo.id}")
testDriver?.setAllConstraintsMet(workInfo.id)
if(workInfo.state == WorkInfo.State.SUCCEEDED) {
Log.d("TAG", workInfo.state.name)
latch.countDown()
} else if(workInfo.state != WorkInfo.State.ENQUEUED) {
Log.d("TAG", workInfo.state.name)
latch.countDown()
}
}
})
谢谢,Paul