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

11
我使用定制的初始化与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()方法被调用时会抛出异常,因为它不知道在清单文件中已经禁用了自动初始化,并且我的测试无法读取清单文件中的值。

如果有任何帮助或建议,将不胜感激。


你使用的是哪个版本的Robolectric?你是否指定了一个特殊的清单文件供测试使用?你是否在test/目录中覆盖了清单文件?如果这不是Robolectric测试,你也可以尝试自己初始化Workmanager。 - whlk
我也有这个问题,但我的应用程序不需要自定义初始化。 如果我像上面那样手动调用WorkManager.initialize(),我会得到相同的错误。 如果我调用initialize(),我会得到```java.lang.IllegalStateException: WorkManager没有正确初始化。最可能的原因是您在清单中禁用了WorkManagerInitializer,但忘记在Application#onCreate或ContentProvider中调用WorkManager#initialize。``看起来这种情况没有好的解决方案。无论是否调用initialize()都会出现问题。陷入困境。 - Kabliz
我有完全相同的问题。我通过 Manifest 禁用了默认初始化,并且在正常运行应用程序时它可以正常工作,但是当我运行 Roboelectric 测试时,它会失败并显示您提到的错误。 - Tom Wayne
有人找到了解决方案/解决方法吗? - Neo
1个回答

9
我使用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);

根据您的测试基础设施,可以以不同方式获取上下文。

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


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