Android WorkManager имеет ошибку при тестировании с Robolectric - PullRequest
0 голосов
/ 08 января 2019

Я использую диспетчер работы Android с пользовательской инициализацией. чтобы сделать это, я отключаю авто-инициализацию в манифесте, как это

        <provider
        tools:replace="android:authorities"
        android:name="androidx.work.impl.WorkManagerInitializer"
        android:authorities="${applicationId}.work_manager_init"
        android:enabled="false"
        android:exported="false" />

А в коде приложения я использую этот код

private fun initWorkManager() {
    WorkManager.initialize(this, Configuration.Builder().run {
        setWorkerFactory(appComponent.daggerWorkerFactory())
        build()
    })
}

И все работает нормально, когда я запускаю свое приложение. Но когда я тестирую с roboletric, любой класс, которому нужен контекст RuntimeEnvironment.application, выдает это исключение

java.lang.IllegalStateException: WorkManager is already initialized.  
Did you try to initialize it manually without disabling 
WorkManagerInitializer? See WorkManager#initialize(Context, 
Configuration) or the class levelJavadoc for more information.

initWorkManager() получает вызовы и выдает это, потому что он не знает, что auto-init уже отключен в манифесте, и каким-то образом мой тест не может прочитать значения из файла манифеста.

Любая помощь или предложение будут оценены.

1 Ответ

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

Я решил похожую проблему с помощью утилит тестирования Androidx Work Manager. Для справки см. Документы здесь: Документация по тестированию работы Android-менеджера

По сути, вам нужно добавить зависимость, включающую утилиты тестирования менеджера работ:

testImplementation 'androidx.work:work-testing:2.0.1'

Тогда вы сможете вызвать код в вашей тестовой настройке, подобной этой:

final Configuration config = new Configuration.Builder()
    .setMinimumLoggingLevel(Log.DEBUG)
    .setExecutor(new SynchronousExecutor())
    .build();
WorkManagerTestInitHelper.initializeTestWorkManager(
    context, config);

Принимая во внимание, что контекст может быть получен по-разному, в зависимости от вашей тестовой инфраструктуры.

При таком подходе не требуется никаких других шагов, таких как исключение чего-либо из манифеста.

...