Как проверить ведущий MVP Android - PullRequest
9 голосов
/ 09 мая 2019

Я пытаюсь понять, как я должен протестировать свое приложение, я все еще учусь с mockito Я также видел mockk, но не смог заставить его работать, это мой Presenter

class MyPresenterImpl @Inject constructor(var myUseCase: MyUseCase) : MyContract.Presenter {

    private var mView: MyContract.View? = null
    private var disposable: Disposable? = null


    override fun attachView(view: MyContract.View) {
        this.mView = view
        this.mView?.showProgressBar(true)
    }

    override fun loadResults() {

        disposable = getList.execute()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                { result ->
                    mView?.showProgressBar(false)
                    mView?.showResults(result)
                },
                { error ->
                    mView?.showProgressBar(false)
                    mView?.showError(error.localizedMessage)
                })
    }

    override fun rxJavaUnsuscribe() {
        if (disposable != null && !disposable!!.isDisposed) {
            disposable!!.dispose()
        }
    }

    override fun detachView() {
        this.mView = null
    }

}

Как мне проверить этого докладчика? Должен ли я добавить все эти методы?

Я пытался сделать это с mockito, но я также могу использовать mockk.

И некоторые люди говорили мне, что я должен что-то сделать с Schedulers и использовать trampoline, но мне не ясно, может ли кто-нибудь из вас привести пример или немного его объяснить?

Ответы [ 2 ]

0 голосов
/ 18 мая 2019

Если я правильно понял ваш вопрос, то вы пытаетесь понять, как реализовать полный паттерн MVP с юнит-тестами (используя Mockito).

Я написал пример кода (приложение, которое отображает списоккниги), которая объясняет базовую реализацию MVP в одном тестовом примере JUnit: https://github.com/harneev/AndroidMVPkt

Давайте немного поговорим о классах:

  1. ViewContract.kt - Методы определения интерфейсакоторые ведут тупые представления для выполнения действия.
  2. ModelContract.kt - Интерфейс, определяющий методы для выборки данных (из базы данных или с сервера), которые будут инкапсулированы в классе реализации.
  3. Presenter.kt- Обрабатывает всю бизнес-логику и организует эту логику с помощью конкретного представления и модели, введенных в качестве параметров.

Примечание. Presenter является обычным классом, а оркестратор бизнес-логики зависит как от модели, так и от представлений.Некоторым разработчикам нравится добавлять Presenter ссылку на View интерфейс, но в этом смысле он чище.

Теперь перейдем к юнит-тестам (PresenterTest.kt) для этого MVP design.

Я использую mockito-kotlin в качестве основы для насмешки для лучшей поддержки kotlin.

Я добавил только один тестовый пример вэтот сценарий называется test if books are displayed (), который высмеивает ViewContract и ModelContract и инициализирует Presenter.Наконец, метод Mockito.verify проверяет, получил ли просмотр список книг, сгенерированных моделью.

Для лучших случаев модульного тестирования я всегда разбиваю его на следующие три сценария, которые объясняются следующим образом:

// 1. given
how mocks will behave when their respective methods are called
// 2. when
when execution method is called
// 3. then
verify / assert if required action is performed

Надеюсь, это поможет.

0 голосов
/ 12 мая 2019

Чтобы написать модульный тест для вашего докладчика, вам необходимо: 1. mock myUseCase: private val myUseCase = mock<MyUseCase>() 2. add Schedulers.io () and AndroidSchedulers.mainThread () to the constructor of the presenter then you can set Schedulers.trampoline () `при создании объекта презентатора для тестирования:

    class MyPresenterImpl @Inject constructor(
        val myUseCase: MyUseCase,
        val ioScheduler: Scheduler = Schedulers,
        val uiScheduler: Scheduler = AndroidSchedulers.mainThread()
    ) : MyContract.Presenter

затем в seUp() вашего теста:

    presenter = MyPresenterImpl(myUseCase, Schedulers.trampoline(), Schedulers.trampoline())
  1. заглушить функцию execute() варианта использования:
    myUseCase.stub {
        on { execute() }.thenReturn(Single.just(xyz))
    }
  1. подтвердите ваш код

примечания: я предпочитаю использовать версию Mockito Nhaarman

...