我一直在努力处理一个遗留的 Android 应用程序,试图为它添加测试和适当的架构。该应用程序有一个主程序LaunchActivity,它在启动时运行一系列检查。最初,该活动使用 Dagger 来“注入依赖项”,活动将使用该依赖项来运行检查。
我将齿轮转向 MVVM,以便我可以单独测试视图模型,无需检测,并且只需要为 UI 测试注入模拟视图模型。我跟着这篇文章介绍了这些变化,包括切换到使用新的 Dagger Android 方法,如AndroidInjection.inject.
我希望测试能够尽可能多地指导任何更改,因此当我的基本架构正常工作时,我转而编写 UI 测试。现在,必须使用 Dagger 将模拟视图模型注入到活动中被证明是一项艰巨的任务,但我认为我已经找到了一个可行的解决方案。
我已经在使用TestApp带有自定义检测运行器的DexOpener,我将其更改为也实现HasActivityInjector,就像App我的应用程序的实际自定义(都扩展Application)。
对于 Dagger,我创建了单独的模块和一个用于测试的组件:
测试应用组件
@Component(
modules = [
TestDepsModule::class,
TestViewModelModule::class,
TestAndroidContributorModule::class,
AndroidSupportInjectionModule::class
]
)
@Singleton
interface TestAppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun testViewModelModule(testViewModelModule: TestViewModelModule): Builder
fun build(): TestAppComponent
}
fun inject(app: TestFieldIApp)
}
Run Code Online (Sandbox Code Playgroud)
测试视图模型模块
@Module
class TestViewModelModule {
lateinit var mockLaunchViewModel: …Run Code Online (Sandbox Code Playgroud)