【发布时间】: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