使用Dagger2(Robolectric)进行单元测试的模拟jetpack ViewModel

问题描述 投票:1回答:1

所以我正在尝试使用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]
    }
}

这就是我创建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>)
android mvvm dagger-2 android-jetpack
1个回答
3
投票

您应该从appComponent用于在此处创建依赖关系的模块注入测试视图模型。

不要自己创建视图模型。为appComponent创建2个模块,提供原始依赖项,其他模块提供测试/模拟依赖项。像这样的东西 -

@Module
public AppModule {
      public ViewModel appViewModel() { // return original here}
}

  @Module
public TestAppModule extends AppModule {
      public ViewModel appViewModel() { // return test/mock here}
}

在您的测试中,当您创建AppComponent传递TestAppModule而不是AppModule时,您将获得模拟的依赖项。

© www.soinside.com 2019 - 2024. All rights reserved.