【发布时间】: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 没有生成
【问题讨论】: