Spe*_*ake 7 android mvvm dagger-2 android-jetpack
因此,我试图使用Robolectric为我的Activity编写单元测试,但是我不知道如何提供一个模拟的视图模型,以查看如何在类中直接实例化我的vm。这是由于以下事实:jetpack的生命周期感知ViewModel需要实例化Provider类。因此,我实质上是在注入自定义提供程序,然后使用它来创建我的ViewModel。我看过其他示例,但它们似乎都非常混乱。我该如何实现?
class ActivityEpisodeList : AppCompatActivity() {
@Inject
lateinit var vmFactory: ViewModelProvider.Factory
private lateinit var vm: ActivityViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_episode_list)
MvvmDaggerApp.get(this).appComponent.inject(this)
vm = ViewModelProviders.of(this, vmFactory)[ActivityViewModel::class.java]
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我创建ViewModel的方式:
@Module
abstract class ViewModelModule {
@Binds
internal abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory
@Binds
@IntoMap
@ViewModelKey(ActivityViewModel::class)
internal abstract fun postListViewModel(viewModel: ActivityViewModel): ViewModel
}
@Singleton
class ViewModelFactory @Inject constructor(private val viewModels: MutableMap<Class<out ViewModel>, Provider<ViewModel>>) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T = viewModels[modelClass]?.get() as T
}
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
@MapKey
internal annotation class ViewModelKey(val value: KClass<out ViewModel>)
Run Code Online (Sandbox Code Playgroud)
您应该从 appComponent 用于在此处创建依赖项的模块中注入测试视图模型。
不要自己创建视图模型。为 appComponent 创建 2 个模块,其中一个提供原始依赖项,另一个提供测试/模拟依赖项。像这样的东西 -
@Module
public AppModule {
public ViewModel appViewModel() { // return original here}
}
@Module
public TestAppModule extends AppModule {
public ViewModel appViewModel() { // return test/mock here}
}
Run Code Online (Sandbox Code Playgroud)
在您的测试中,当您创建 AppComponent 时传递 TestAppModule 而不是 AppModule,那么您将获得模拟的依赖项。
| 归档时间: |
|
| 查看次数: |
642 次 |
| 最近记录: |