【问题标题】:Android WorkManager has error when testing with Robolectric使用 Robolectric 进行测试时,Android WorkManager 出现错误
【发布时间】:2019-01-08 07:38:20
【问题描述】:

我正在使用带有自定义初始化的 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() get 调用并抛出此错误,因为它不知道清单中已禁用自动初始化,并且不知何故我的测试无法从清单文件中读取值。

任何帮助或建议都会得到满足。

【问题讨论】:

  • 您使用的是哪个版本的 Robolectric?您是否指定了一个特殊的清单文件供您的测试使用?您是否可能覆盖了 test/ 目录中的清单?如果 Workmanager 不是 robolectric 测试,您也可以尝试只自己初始化它。
  • 我也有这个问题,除了我的应用程序不需要自定义初始化。如果我像上面那样手动调用WorkManager.initialize(),我会得到同样的错误。如果我调用initialize(),我会得到```java.lang.IllegalStateException: WorkManager 没有正确初始化。最可能的原因是您在清单中禁用了 WorkManagerInitializer,但忘记在 Application#onCreate 或 ContentProvider 中调用 WorkManager#initialize。似乎没有一个好的方法可以解决这个问题。它抱怨是否调用了 initialize()。第 22 条。
  • 我也有同样的问题。我通过 Manifest 禁用了默认初始化,当我正常运行应用程序时它可以工作,但是当我运行 Roboelectric 测试时它失败并出现您提到的错误。
  • 有人找到解决方案/解决方法吗?

标签: android robolectric android-workmanager


【解决方案1】:

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

而上下文可以通过不同的方式获得,具体取决于您的测试基础架构。

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

【讨论】:

    猜你喜欢
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    相关资源
    最近更新 更多