Dagger Hilt在测试中无法注入

13

我正在尝试使用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()
            ...
        }
    }

测试失败是因为在GameActivity.onCreate中,所有带有@inject注解的GameActivity字段均为空。

GameActivity是:

@AndroidEntryPoint
class GameActivity : AppCompatActivity()

这些模块包括:

@Module
@InstallIn(ActivityComponent::class)
open class LevelModule { ... } 

@Module
@InstallIn(ActivityComponent::class)
class TestLevelModule {

@Module
@InstallIn(ApplicationComponent::class)
class AppModule() { ... } 

@Module
@InstallIn(ApplicationComponent::class)
class TestAppModule() { ... } 

当我运行应用程序时,它可以工作,但是当我运行测试时,GameActivity 没有被注入。所有带有@Inject 的字段都为null。

有人知道问题出在哪里吗?


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

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

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

编辑:

我不知道为什么,在此PR上测试通过了:


我克隆了你的代码库,测试可以运行,但是通过将Hilt注释处理器从'kapt'更改为'annotationProcessor'导致测试失败。 - Saurabh Thorat
使用 kapt 运行测试也可以,但是会失败,因为它们没有被注入。 - Lucas Lima
我不知道为什么,但测试在CI上通过了。 - Lucas Lima
1
在Android Studio中运行Hilt测试时,这是一个已知的错误。他们有一个解决方法来设置Gradle测试配置,并通过gradle而不是IDE运行测试。问题正在此处跟踪:https://github.com/google/dagger/issues/1956 - kingargyle
1个回答

1
根据测试指南,您必须替换绑定。在测试类中创建一个新模块来定义测试绑定:
@UninstallModules(AnalyticsModule::class)
@HiltAndroidTest
class SettingsActivityTest {

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

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

  ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接