Я пытаюсь написать инструментальные тесты Android для класса, который содержит WorkManager WorkRequests.
В течение долгого времени я застревал в том месте, где я мог видеть, как рабочих ставят в очередь, но их так и не казнили.Через некоторое время, методом проб и ошибок я понял, что следующее ограничение блокировало тест:
...
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 - это правда, но все равно ограничение WorkManager не выполняется, и поэтому работа не выполняется.
Также пробовал:
val testDriver = getTestDriver()
с
testDriver?.setAllConstraintsMet(workInfo.id)
внутри моего метода наблюдения LiveData by tag, который, как я вижу, выполняется один раз для состояния 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()
}
}
})
Спасибо, Пол