匕首柄在测试中没有注入。

问题描述 投票:0回答:1

我试图使用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.comlucasnlmantimine-androidpull95。

  • https:/github.comlucasnlmantimine-androidpull95commitsfcc1b3782b8d456898529dd3ba2410ac5f2da6d5。

编辑

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

android kotlin dagger dagger-hilt
1个回答
0
投票

根据 测试指南,

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

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

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

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

  ...
}
© www.soinside.com 2019 - 2024. All rights reserved.