Макет реактивного ранца ViewModel для модульных испытаний с использованием Dagger2 (Robolectric) - PullRequest
0 голосов
/ 19 февраля 2019

Таким образом, я пытаюсь написать модульный тест для моей Деятельности, используя Robolectric, однако я не знаю, как предоставить смоделированную модель представления, видящую, как мой vm создается непосредственно в классе.Это связано с тем, что ViewModel с поддержкой жизненного цикла Jetpack требует класса 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>)

1 Ответ

0 голосов
/ 19 февраля 2019

Вы должны внедрить модель Test View из модуля, который appComponent использует для создания здесь зависимостей.

Не создавайте модель представления самостоятельно.Создайте 2 модуля для appComponent, который обеспечивает исходные зависимости, а другой - зависимостями test / mock.Примерно так -

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

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

В своем тесте, когда вы создаете свой AppComponent, пропускаете TestAppModule вместо AppModule, тогда вы получите ложные зависимости.

...