Dagger 未注入 activity

Dagger not injecting activity

我目前正在努力解决这个 article,试图在 android 中使用 Kotlin 模拟匕首依赖项,但遇到了一些麻烦。

我收到一条错误消息,指出 activityInjector 未初始化。

我做错了什么?

TestAppComponent

@Singleton
@Component(
    modules = [
        AndroidSupportInjectionModule::class,
        TestAppModule::class,
        ActivityModule::class,
        FragmentModule::class,
        ViewModelModule::class
    ]
)
interface TestAppComponent : AndroidInjector<TestApp> {

    @Component.Builder
    abstract class Builder : AndroidInjector.Builder<TestApp>() {
        abstract fun appModule(appModule: TestAppModule): Builder
    }
}

测试应用程序

class TestApp: Application(), HasActivityInjector {

    @Inject
    lateinit var activityInjector: DispatchingAndroidInjector<Activity>

    override fun activityInjector(): AndroidInjector<Activity>  = activityInjector
}

测试喷油器

class TestInjector(private val testAppModule: TestAppModule) {

    fun inject() {
        val testApp= ApplicationProvider.getApplicationContext() as TestApp

        DaggerTestAppComponent
            .builder()
            .appModule(testAppModule)
            .create(testApp)
            .inject(testApp)
    }
}

Activity 模块

@Module
abstract class ActivityModule {
    @ContributesAndroidInjector
    abstract fun provideNavigationActivity(): NavigationActivity
}

仪表化单元测试

@Rule
@JvmField
var navigationActivityTestRule = ActivityTestRule(NavigationActivity::class.java, true, true)

@MockK
private lateinit var repo: Repo

@Before
fun setUp() {
    MockKAnnotations.init(this)

    TestInjector(TestAppModule(repo)).inject()
}

在您的应用源代码的 onCreate 中创建一个 Dagger 组件

class TestApp: Application(), HasActivityInjector {

    @Inject
    lateinit var activityInjector: DispatchingAndroidInjector<Activity>

    override fun onCreate() {
        super.onCreate()
        DaggerTestAppComponent.builder()
            .application(this)
            .build()
            .inject(this)
    }

    override fun activityInjector(): AndroidInjector<Activity>  = activityInjector
}

并且组件像这样变化

@Singleton
@Component(
    modules = [
        AndroidSupportInjectionModule::class,
        TestAppModule::class,
        ActivityModule::class,
        FragmentModule::class,
        ViewModelModule::class
    ]
)
interface TestAppComponent{

    @Component.Builder
    interface Builder{
        @BindsInstance fun application(app: TestApp): Builder
        fun build(): TestAppComponent
    }

    fun inject(app: TestApp)
}

由于 ActivityTestRule,您的 activity 甚至在从您的设置方法调用 TestInjector 之前就已启动。您需要推迟 activity 启动,直到 DaggerTestAppComponent 构建完成。

试试这个:

@Rule
@JvmField
var navigationActivityTestRule = ActivityTestRule(NavigationActivity::class.java, true, false) 
// ^^ Notice the third parameter here, passing false will not launch the activity

@MockK
private lateinit var repo: Repo

@Before
fun setUp() {
    MockKAnnotations.init(this)
    TestInjector(TestAppModule(repo)).inject()

    // Launch the activity now that TestInjector is called
    navigationActivityTestRule.launchActivity(Intent()) 
}