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()
            ...
        }
    }

Тест не проходит GameActivity.onCreate потому что все поля GameActivity с @Inject равны нулю.

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 равны нулю.

Кто-нибудь знает, в чем дело?


Если полезно, весь код и тест находятся здесь:

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

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

РЕДАКТИРОВАТЬ

Не знаю почему, но тесты прошли по этому пиару:

1 ответ

Согласно руководству по тестированию,

необходимо заменить привязку. Создайте новый модуль в тестовом классе, который определяет тестовую привязку:

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

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

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

  ...
}
Другие вопросы по тегам