Dagger Hilt 未在测试中注入

Luc*_*ima 9 android kotlin dagger dagger-hilt

我正在尝试使用 Dagger Hilt 和 Robolectric 运行测试:

@RunWith(RobolectricTestRunner::class)
@UninstallModules(LevelModule::class, AppModule::class)
@Config(sdk = [16, 28], application = HiltTestApplication::class)
@LooperMode(LooperMode.Mode.PAUSED)
@HiltAndroidTest
class LevelFragmentTest {

    @get:Rule
    var rule = HiltAndroidRule(this)

    @Test
    fun testShowGameOverWhenTapAMine() {
        launchActivity<GameActivity>().onActivity { activity ->
            ShadowLooper.runUiThreadTasks()
            ...
        }
    }
Run Code Online (Sandbox Code Playgroud)

测试失败,GameActivity.onCreate因为带有 @Inject 的 GameActivity 的所有字段都为空。

游戏活动是:

@AndroidEntryPoint
class GameActivity : AppCompatActivity()
Run Code Online (Sandbox Code Playgroud)

这些模块是:

@Module
@InstallIn(ActivityComponent::class)
open class LevelModule { ... } 
Run Code Online (Sandbox Code Playgroud)
@Module
@InstallIn(ActivityComponent::class)
class TestLevelModule {
Run Code Online (Sandbox Code Playgroud)
@Module
@InstallIn(ApplicationComponent::class)
class AppModule() { ... } 
Run Code Online (Sandbox Code Playgroud)
@Module
@InstallIn(ApplicationComponent::class)
class TestAppModule() { ... } 
Run Code Online (Sandbox Code Playgroud)

它在我运行应用程序时有效,但是当我运行测试时,GameActivity它没有被注入。所有字段@Inject都为空。

有没有人知道它有什么问题?


如果有用,整个代码和测试在这里:

  • https://github.com/lucasnlm/antimine-android/pull/95

  • https://github.com/lucasnlm/antimine-android/pull/95/commits/fcc1b3782b8d456898529dd3ba2410ac5f2da6d5

编辑

我不知道为什么,但测试通过了这个 PR:

小智 1

根据测试指南

您必须更换绑定。在定义测试绑定的测试类中创建一个新模块:

@UninstallModules(AnalyticsModule::class)
@HiltAndroidTest
class SettingsActivityTest {

  @Module
  @InstallIn(ApplicationComponent::class)
  abstract class TestModule {

    @Singleton
    @Binds
    abstract fun bindAnalyticsService(
      analyticsServiceImpl: AnalyticsServiceImpl
    ): AnalyticsService
  }

  ...
}
Run Code Online (Sandbox Code Playgroud)