使用Robolectric测试时,Android WorkManager出现错误

时间:2019-01-08 07:38:20

标签: android robolectric android-workmanager

我正在使用具有自定义初始化功能的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 :(得分:0)

我借助Androidx Work Manager测试工具解决了类似的问题。供参考,请参阅此处的文档:Android work manager testing docs

基本上,您需要做的是添加一个依赖项以包括工作管理器测试实用程序:

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);

根据测试基础架构,可以用不同的方式获得上下文。

采用这种方法,无需执行其他步骤,例如从清单中排除某些内容。