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/95https://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
}
...
}