我正在使用具有自定义初始化功能的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已被禁用,并且我的测试无法从清单文件中读取值。
任何帮助或建议将不胜感激。
答案 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);
根据测试基础架构,可以用不同的方式获得上下文。
采用这种方法,无需执行其他步骤,例如从清单中排除某些内容。