Написание Unit - тестов в Android

124
22 ноября 2019, 21:00

Всем привет, пишу тестовое задание на Android - разработчика, и одним из требований является написание нескольких Jnit тестов (которые я ни разу не писал).

Мое приложение реализует паттерн MVP с Moxy. Я перенес всю структуру в test, и дальше не знаю к чему приступать.

Например, есть в Presenter метод для получения result с api

public void getResults(String textSearch){
        mCompositeDisposable.add(ApiUtils.getApi()
                .getResponse(textSearch)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe(disposable -> mView.showRefresh())
                .doFinally(() -> mView.hideRefresh())
                .subscribe(
                        response -> {
                            mView.showResults(response.getResults());
                        },
                        throwable -> mView.showError()
                ));
    }

Что тут нужно тестировать? Придет результат не того типа? Ну провалится от в ветку throwable и все.

Ссылка на приложение

Answer 1

Что нужно тестировать ? Ответ прост - работу данного метода.

Выделяем, только работу данного метода - он получает параметр textSearch, отдает его вовне и как результат получает response или throwable, которые производят соответствующие реакции у mView.

Сам тест прост, однако сама инфраструктура теста сложная (к примеру это можно тестировать с помощью библиотеки Mockito). Нужно сделать несколько моков:

  • объект, где находится метод getResults
  • mCompositeDisposable
  • ApiUtils.getApi() (не знаю что оно собой представляет)
  • mView

Возможно, что-то придется отрефакторить. Суть сводиться к тому, чтобы измениться поведение всех методов внешних, по отношению к тестируемому методу, объектов. Моки позволяют делать так, что например, вызов ApiUtils.getApi().getResponse(textSearch) на самом деле ничего не будет делать, а вернет готовый response объект / или throwable (в зависимости от того, что хотим проверить - или отработало или ошибка), а mCompositeDisposable.add() ничего никуда добавлять не будет, а просто имитирует это действие также все методы mView ничего не будут делать, важен лишь сам факт, они были вызваны или были вызваны с конкретным параметром(ами).

Таким образом, все сводится к паре тестов (довольно длинных):

  1. вызвали метод getResults с каким-то значение (неважно с каким), вернулся response и как факт корректной работы были вызваны методы mView showRefresh, hideRefresh, showResults(c конкретным значением response.getResults())
  2. вызвали метод getResults с каким-то значение (неважно с каким), вернулся throwable и как факт корректной работы были вызваны методы mView showRefresh, hideRefresh, showError.

Я, конечно, могу сильно заблуждаться в правильности такого подхода, но я вижу его вполне разумным. Собственно, все вышеописанное выглядит какой-то магией на первый взгляд, но если почитать документацию к Moсkito, которая очень короткая и четко все описывающая, то все встанет на свои места, ну и неделя на вникание/пробование потребуется. Удачи )

READ ALSO
Webkit android вывод элементов

Webkit android вывод элементов

Если ли какая нибудь возможность в webkit выводить определенные элементы/блоки со страницы сайта, работоспособныеНапример, есть мобильная...

120
Зачем нужно return this, внутри класса Builder, в шаблоне Builder

Зачем нужно return this, внутри класса Builder, в шаблоне Builder

У вас применен шаблон Builder и шаблон Fluent Interface

132
Не получается использовать Alarm Manager для повторения вызова функции

Не получается использовать Alarm Manager для повторения вызова функции

Хочу использовать AlarmManager, для того, чтобы приложение делало определенные действия в полночь (запись в бд), но не могу сконструировать простое...

122
Как вернуть несколько изображений Java

Как вернуть несколько изображений Java

Пишу маленькое REST приложениеЕсть метод в контроллере

126