Как я могу протестировать Android WorkManager с ограничением setRequiredNetworkType (NetworkType.CONNECTED)? - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь написать инструментальные тесты 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()
            }
        }
    })

Спасибо, Пол

1 Ответ

0 голосов
/ 29 мая 2019

Вы должны использовать WorkManagerTestInitHelper.Как только вы используете TestDriver и помечаете ограничение как выполненное, ваш Worker должен выполнить.

...