【问题标题】:DaggerTestAppComponent is not getting generated within the Android test directoryDaggerTestAppComponent 未在 Android 测试目录中生成
【发布时间】:2026-02-20 17:30:01
【问题描述】:

我正在为 DI 使用 dagger android。我正在尝试通过将 Viewmodel 注入我的测试类(在测试目录中)来测试它。但是没有生成 DaggerTestAppComponent。

应用组件:-

@Component(
    modules = [
        AndroidSupportInjectionModule::class,
        ActivityBinder::class,
        DataBaseBinder::class,
        NetworkBinder::class,
        RoomBinder::class,
        ViewModelBinder::class,
        UseCasesBinder::class,
        DataSourceBinder::class,
        ServiceBinder::class
    ]
)
interface AppComponent : AndroidInjector<ZeniusApp> {

    @Component.Builder
    interface Builder {

        @BindsInstance
        fun application(application: Application): Builder

        fun build(): AppComponent
    }
}

ViewModelBinder(模块):-

abstract class ViewModelBinder {
    @Binds
    @Singleton
    abstract fun providesViewModelFactory(factory: ViewModelProviderFactory): ViewModelProvider.Factory

    @Binds
    @IntoMap
    @ViewModelKey(LoginViewModel::class)
    abstract fun providesLoginViewModel(loginViewModel: LoginViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(LoginEmailViewModel::class)
    abstract fun providesLoginEmailViewModel(loginEmailViewModel: LoginEmailViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(SignUpViewModel::class)
    abstract fun providesSignUpViewModel(signUpViewModel: SignUpViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(ProfileViewModel::class)
    abstract fun providesProfileViewModel(profileViewModel: ProfileViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(HomeViewModel::class)
    abstract fun providesHomeViewModel(homeViewModel: HomeViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(LiveClassesViewModel::class)
    abstract fun providesLiveClassesViewModel(liveClassesViewModel: LiveClassesViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(MasterClassesViewModel::class)
    abstract fun providesMasterClassesViewModel(masterClassesViewModel: MasterClassesViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(SubjectViewModel::class)
    abstract fun providesSubjectViewModel(subjectViewModel: SubjectViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(VideoViewModel::class)
    abstract fun providesVideoViewModel(videoViewModel: VideoViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(AccountHomeViewModel::class)
    abstract fun providesAccountViewModel(accountHomeViewModel: AccountHomeViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(AssessmentViewModel::class)
    abstract fun providesAssessmentViewModel(assessmentViewModel: AssessmentViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(ReportErrorViewModel::class)
    abstract fun providesReportErrorViewModel(reportErrorViewModel: ReportErrorViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(TryoutsViewModel::class)
    abstract fun providesTryoutsViewModel(tryoutsViewModel: TryoutsViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(SearchViewModel::class)
    abstract fun providesSearchViewModel(searchViewModel: SearchViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(BookmarkViewModel::class)
    abstract fun providesBookmarkViewModel(bookmarkViewModel: BookmarkViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(RemoteConfigViewModel::class)
    abstract fun providesRemoteConfigViewModel(remoteConfigViewModel: RemoteConfigViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(ResumeViewModel::class)
    abstract fun providesResumeViewModel(resumeViewModel: ResumeViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(TipsViewModel::class)
    abstract fun providesTipsViewModel(tipsViewModel: TipsViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(PaymentViewModel::class)
    abstract fun providesPaymentViewModel(paymentViewModel: PaymentViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(OnBoardingViewModel::class)
    abstract fun providesOnBoardingViewModel(onBoardingViewModel: OnBoardingViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(ClassroomViewModel::class)
    abstract fun providesClassroomViewModel(classroomViewModel: ClassroomViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(ResolveDeepLinkViewModel::class)
    abstract fun providesLiveClassRoomViewModel(lveClassroomViewModel: ResolveDeepLinkViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(GTViewModel::class)
    abstract fun providesGTViewModel(gtViewModel: GTViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(AskQuestionViewModel::class)
    abstract fun providesAskQuestionViewModel(askQuestionViewModel: AskQuestionViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(AssessmentViewSolutionViewModel::class)
    abstract fun providesAssessmentSolutionViewModel(
        viewModel: AssessmentViewSolutionViewModel
    ): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(DoubtsViewModel::class)
    abstract fun providesDoubtsViewModel(doubtsViewModel: DoubtsViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(AppRatingViewModel::class)
    abstract fun providesAppRatingViewModel(appRatingViewModel: AppRatingViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(FlashCardViewModel::class)
    abstract fun providesFlashCardViewModel(mViewModel: FlashCardViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(ChapterSummaryViewModel::class)
    abstract fun provideChapterSummaryViewModel(mViewModel: ChapterSummaryViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(DoubtSolvingViewModel::class)
    abstract fun providesDoubtSolvingViewModel(doubtSolvingViewModel: DoubtSolvingViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(QuestionViewModel::class)
    abstract fun provideQuestionViewModel(mViewModel: QuestionViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(VerifyPhoneViewModel::class)
    abstract fun provideVerifyPhoneViewModel(mViewModel: VerifyPhoneViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(DtaViewModel::class)
    abstract fun provideDtaViewModel(mViewModel: DtaViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(OpinionPollViewModel::class)
    abstract fun provideOpinionPollViewModel(mViewModel: OpinionPollViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(MyOpinionPollsViewModel::class)
    abstract fun provideMyOpinionPollViewModel(mViewModel: MyOpinionPollsViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(PracticeViewModel::class)
    abstract fun providePracticeViewModel(mViewModel: PracticeViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(ReminderViewModel::class)
    abstract fun providesReminderViewModel(reminderViewModel: ReminderViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(ExamChildDialogViewModel::class)
    abstract fun provideExamChildViewModel(examChildViewModel: ExamChildDialogViewModel): ViewModel
}

TestAppComponent :-

@Singleton
@Component(
    modules = [
        ViewModelBinder::class
    ]
)
interface TestAppComponent : AppComponent {
    
    fun inject(paymentViewModelTest: PaymentViewModelTest)


//    @Component.Builder
//    interface Builder {
//
//        @BindsInstance
//        fun application(application: Application): Builder
//
//        fun build(): TestAppComponent
//    }
}

ViewModelTestBinder(用于提供模拟依赖):-

class ViewModelTestBinder : ViewModelBinder() {

    override fun providesViewModelFactory(factory: ViewModelProviderFactory): ViewModelProvider.Factory = Mockito.mock(ViewModelProvider.Factory::class.java)

    override fun providesLoginViewModel(loginViewModel: LoginViewModel): ViewModel = Mockito.mock(LoginViewModel::class.java)

    override fun providesLoginEmailViewModel(loginEmailViewModel: LoginEmailViewModel): ViewModel = Mockito.mock(LoginEmailViewModel::class.java)

    override fun providesSignUpViewModel(signUpViewModel: SignUpViewModel): ViewModel = Mockito.mock(SignUpViewModel::class.java)

    override fun providesProfileViewModel(profileViewModel: ProfileViewModel): ViewModel = Mockito.mock(ProfileViewModel::class.java)

    override fun providesHomeViewModel(homeViewModel: HomeViewModel): ViewModel = Mockito.mock(HomeViewModel::class.java)

    override fun providesLiveClassesViewModel(liveClassesViewModel: LiveClassesViewModel): ViewModel = Mockito.mock(LiveClassesViewModel::class.java)

    override fun providesMasterClassesViewModel(masterClassesViewModel: MasterClassesViewModel): ViewModel = Mockito.mock(MasterClassesViewModel::class.java)

    override fun providesSubjectViewModel(subjectViewModel: SubjectViewModel): ViewModel = Mockito.mock(SubjectViewModel::class.java)

    override fun providesVideoViewModel(videoViewModel: VideoViewModel): ViewModel = Mockito.mock(VideoViewModel::class.java)

    override fun providesAccountViewModel(accountHomeViewModel: AccountHomeViewModel): ViewModel = Mockito.mock(AccountHomeViewModel::class.java)

    override fun providesAssessmentViewModel(assessmentViewModel: AssessmentViewModel): ViewModel = Mockito.mock(AssessmentViewModel::class.java)

    override fun providesReportErrorViewModel(reportErrorViewModel: ReportErrorViewModel): ViewModel = Mockito.mock(ReportErrorViewModel::class.java)

    override fun providesTryoutsViewModel(tryoutsViewModel: TryoutsViewModel): ViewModel = Mockito.mock(TryoutsViewModel::class.java)

    override fun providesSearchViewModel(searchViewModel: SearchViewModel): ViewModel = Mockito.mock(SearchViewModel::class.java)

    override fun providesBookmarkViewModel(bookmarkViewModel: BookmarkViewModel): ViewModel = Mockito.mock(BookmarkViewModel::class.java)

    override fun providesRemoteConfigViewModel(remoteConfigViewModel: RemoteConfigViewModel): ViewModel = Mockito.mock(RemoteConfigViewModel::class.java)

    override fun providesResumeViewModel(resumeViewModel: ResumeViewModel): ViewModel = Mockito.mock(ResumeViewModel::class.java)

    override fun providesTipsViewModel(tipsViewModel: TipsViewModel): ViewModel = Mockito.mock(TipsViewModel::class.java)

    override fun providesPaymentViewModel(paymentViewModel: PaymentViewModel): ViewModel = Mockito.mock(PaymentViewModel::class.java)

    override fun providesOnBoardingViewModel(onBoardingViewModel: OnBoardingViewModel): ViewModel = Mockito.mock(OnBoardingViewModel::class.java)

    override fun providesClassroomViewModel(classroomViewModel: ClassroomViewModel): ViewModel = Mockito.mock(ClassroomViewModel::class.java)

    override fun providesLiveClassRoomViewModel(lveClassroomViewModel: ResolveDeepLinkViewModel): ViewModel = Mockito.mock(ResolveDeepLinkViewModel::class.java)

    override fun providesGTViewModel(gtViewModel: GTViewModel): ViewModel = Mockito.mock(GTViewModel::class.java)

    override fun providesAskQuestionViewModel(askQuestionViewModel: AskQuestionViewModel): ViewModel = Mockito.mock(AskQuestionViewModel::class.java)

    override fun providesAssessmentSolutionViewModel(
            viewModel: AssessmentViewSolutionViewModel
    ): ViewModel = Mockito.mock(AssessmentViewModel::class.java)

    override fun providesDoubtsViewModel(doubtsViewModel: DoubtsViewModel): ViewModel = Mockito.mock(DoubtsViewModel::class.java)

    override fun providesAppRatingViewModel(appRatingViewModel: AppRatingViewModel): ViewModel = Mockito.mock(AppRatingViewModel::class.java)

    override fun providesFlashCardViewModel(mViewModel: FlashCardViewModel): ViewModel = Mockito.mock(FlashCardViewModel::class.java)

    override fun provideChapterSummaryViewModel(mViewModel: ChapterSummaryViewModel): ViewModel = Mockito.mock(ChapterSummaryViewModel::class.java)

    override fun providesDoubtSolvingViewModel(doubtSolvingViewModel: DoubtSolvingViewModel): ViewModel = Mockito.mock(DoubtSolvingViewModel::class.java)

    override fun provideQuestionViewModel(mViewModel: QuestionViewModel): ViewModel = Mockito.mock(QuestionViewModel::class.java)

    override fun provideVerifyPhoneViewModel(mViewModel: VerifyPhoneViewModel): ViewModel = Mockito.mock(VerifyPhoneViewModel::class.java)

    override fun provideDtaViewModel(mViewModel: DtaViewModel): ViewModel = Mockito.mock(DtaViewModel::class.java)

    override fun provideOpinionPollViewModel(mViewModel: OpinionPollViewModel): ViewModel = Mockito.mock(OpinionPollViewModel::class.java)

    override fun provideMyOpinionPollViewModel(mViewModel: MyOpinionPollsViewModel): ViewModel = Mockito.mock(MyOpinionPollsViewModel::class.java)

    override fun providePracticeViewModel(mViewModel: PracticeViewModel): ViewModel = Mockito.mock(PracticeViewModel::class.java)

    override fun providesReminderViewModel(reminderViewModel: ReminderViewModel): ViewModel = Mockito.mock(ReminderViewModel::class.java)

    override fun provideExamChildViewModel(examChildViewModel: ExamChildDialogViewModel): ViewModel = Mockito.mock(ExamChildDialogViewModel::class.java)
}

PaymentViewModelTest:-

class PaymentViewModelTest {

    @Inject
    lateinit var paymentViewModel: PaymentViewModel

    @Before
    fun setUp() {
//        val component = DaggerTestAppComponent
//            .builder()
//            .applicationModule(ApplicationModule(this))
//            .build()
//        component.into(this)
    }

    @Test
    fun dummytest() {
        paymentViewModel.fetchPaymentStatus()
        assertEquals(4, 2 + 2)
    }
}

DaggerTestAppComponent 没有生成

【问题讨论】:

    标签: android dagger


    【解决方案1】:

    我相信您忘记在 androidTest 构建变体上运行 dagger-compiler 注释处理器。由于您似乎在使用 Kotlin,因此您需要添加以下内容:

    androidTestImplementation "com.google.dagger:dagger:2.32"
    kaptAndroidTest "com.google.dagger:dagger-compiler:2.32"
    

    到您的build.gradle 的依赖项块中(只需替换为您使用的匕首版本)。默认注释处理器不会为您的测试和 android 测试构建变体生成任何代码(它们不会在构建期间执行)。

    【讨论】: