使用 Workmanager 进行 Hilt Instrumentation 测试无法正常工作

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)

Haz*_*war 3

这是因为根据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)