【发布时间】:2019-07-12 20:06:06
【问题描述】:
所以我正在尝试使用 Robolectric 为我的 Activity 编写一个单元测试,但是我不知道如何提供一个模拟视图模型来查看我的虚拟机是如何在类中直接实例化的。这是因为 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]
}
}
这就是我创建 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>)
【问题讨论】:
-
你能告诉我们你的单元测试课吗?
-
我遇到了类似的问题。这里的问题是活动知道它是如何被注入的。尝试查看 Dagger Android,它将允许您将字段依赖项注入到您的活动中。不过,这将需要大量的重构。
-
@SeanBlahovici 我目前在上面的示例中使用字段注入。还是您的意思是某种构造函数注入?
标签: android mvvm dagger-2 android-jetpack