sun*_*son 6 android android-espresso android-instrumentation android-workmanager dagger-hilt
当我尝试在包含 WorkManager 的应用程序中运行 ActivityScenario 时,我在启动时收到以下错误:
java.lang.IllegalStateException: WorkManager is not initialized properly. You have explicitly disabled WorkManagerInitializer in your manifest, have not manually called WorkManager#initialize at this point, and your Application does not implement Configuration.Provider.
Run Code Online (Sandbox Code Playgroud)
使用工件WorkManagerTestInitHelper中的work-test也没有帮助。
WorkManager 的定义如下:
@Provides
@Singleton
fun provideWorkmanager(@ApplicationContext context: Context) = WorkManager.getInstance(context)
Run Code Online (Sandbox Code Playgroud)
这是我的测试自动取款机:
@HiltAndroidTest
@RunWith(AndroidJUnit4::class)
class LoginTest {
@get:Rule(order = 0)
var hiltRule = HiltAndroidRule(this)
@get:Rule(order = 1)
val activityRule = ActivityScenarioRule(MainActivity::class.java)
@Before
fun before() {
val context = InstrumentationRegistry.getInstrumentation().targetContext
val config = Configuration.Builder()
.setMinimumLoggingLevel(Log.DEBUG)
.setExecutor(SynchronousExecutor())
.build()
WorkManagerTestInitHelper.initializeTestWorkManager(context, config)
}
@Test
fun test() {
...
}
}
Run Code Online (Sandbox Code Playgroud)
这是因为根据Google 文档@get:Rule,在执行之前执行:@Before
该规则提供单个活动的功能测试。被测活动在用 @Test 注释的每个测试之前以及用 @Before 注释的任何方法之前启动。测试完成并且所有用@After注释的方法都完成后终止。要访问测试逻辑中的测试活动,请向 ActivityScenarioRule.getScenario().onActivity() 提供可运行的回调。
为了解决这个问题,您需要在尝试启动活动之前WorkManager在测试中初始化 。WorkManagerTestInitHelper
要做到这一点,你应该避免使用ActivityScenarioRule,而是使用ActivityScenario,你可以这样做:
@HiltAndroidTest
@RunWith(AndroidJUnit4::class)
class LoginTest {
private lateinit var scenario: ActivityScenario<MainActivity>
@get:Rule
var hiltRule = HiltAndroidRule(this)
@Before
fun before() {
val context = InstrumentationRegistry.getInstrumentation().targetContext
val config = Configuration.Builder()
.setMinimumLoggingLevel(Log.DEBUG)
.setExecutor(SynchronousExecutor())
.build()
WorkManagerTestInitHelper.initializeTestWorkManager(context, config)
scenario = launchActivity()
}
@Test
fun test() {
scenario.moveToState(Lifecycle.State.CREATED).onActivity {
activity -> // do some test with the activity
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1464 次 |
| 最近记录: |