簡體   English   中英

使用Dagger2(Robolectric)進行單元測試的模擬jetpack ViewModel

[英]Mock jetpack ViewModel for unit tests using Dagger2 (Robolectric)

所以我正在嘗試使用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>)

您應該從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時,您將獲得模擬的依賴項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM