我试图使用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的测试通过了。
根据 测试指南,
你必须更换绑定。在测试类中创建一个新模块,定义测试绑定。
@UninstallModules(AnalyticsModule::class)
@HiltAndroidTest
class SettingsActivityTest {
@Module
@InstallIn(ApplicationComponent::class)
abstract class TestModule {
@Singleton
@Binds
abstract fun bindAnalyticsService(
analyticsServiceImpl: AnalyticsServiceImpl
): AnalyticsService
}
...
}