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())
}
我目前正在努力解决这个 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())
}