如何使用setRequiredNetworkType(NetworkType.CONNECTED)约束测试Android WorkManager?

6

我正在尝试编写用于包含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

1个回答

0

你应该使用 WorkManagerTestInitHelper。一旦你使用了 TestDriver 并标记了你的约束条件已满足,你的 Worker 就会执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接