Модернизация модульного тестирования RxJava

Я использую библиотеку Mosby для реализации шаблона MVP вместе с Retrofit и RxJava для моих вызовов API почти точно так же, как это делается здесь.

Я только начал с пользовательского интерфейса и модульного тестирования, и хотя у меня не было проблем с имитацией моего API во время тестирования пользовательского интерфейса (с MockWebServer), я не могу понять, как имитировать мой API для модульного тестирования.

Я просмотрел ответ здесь, но похоже, что он все еще пытается сделать настоящий вызов API, так как я вижу, что он приземляется onError (сетевое исключение) вместо onNext/onComplete. Если я использую MockWebServer, он также попадет в onError, но не в тип сети.

Что я хочу: когда ведущий делает вызов API:

signUpSubscriber = api.signUpUser(credentials)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe(new Subscriber<User>()

На самом деле не делать вызов, а скорее иметь возможность передать ему объект «Пользователь», который он должен вернуть, чтобы тест мог перейти к onNext и onComplete.


person kkl260    schedule 28.03.2017    source источник
comment
так что просто замените API на макет, который возвращает пользовательский объект, какое тестирование здесь проводится? вы тестируете ведущего, и вас не волнует реальная логика загрузки сети?   -  person yosriz    schedule 28.03.2017
comment
Я использую MockWebServer для возврата объекта пользователя, но по какой-то причине он продолжает приземляться в onError. Правильно насчет тестирования ведущего (я хочу убедиться, что singUpSuccessful вызывается, если возвращаемый объект является правильным пользователем (код 201), а onError вызывается, если возвращаемый json является ошибкой (400)   -  person kkl260    schedule 28.03.2017
comment
Какую ошибку вы получаете? Можете ли вы добавить трассировку стека ошибки? Подключается ли ваш Retrofit API к фиктивному серверу или к реальному серверу при вызове api.signUpUser(credentials) в тесте пользовательского интерфейса прямо сейчас?   -  person sockeqwe    schedule 29.03.2017
comment
Как сказал @yosriz, просто используйте Mockito, чтобы заглушить желаемое поведение API, и используйте этот макет для проверки вызова метода.   -  person Than    schedule 29.03.2017
comment
@ Чем нет, не делайте этого, потому что это не проверяет ошибки подключения службы, коды состояния сервера (т.е. возвращает 500 или 404) и т. д. Используйте MockWebServer, но вы должны убедиться, что API подключается к MockWebServer (измените базовый URL-адрес чтобы указать на ваш фиктивный сервер).   -  person sockeqwe    schedule 30.03.2017
comment
@sockeqwe Зачем? Из того, что я вижу, он хочет, чтобы ведущий модульного тестирования не проводил полное интеграционное тестирование. Если смотреть с точки зрения ведущего, то либо пункт и успех, либо какая-то ошибка и исключение. Если он хочет имитировать разные ошибки, он может просто заглушить API с разными Observable.error(customError). Нет причин для этого теста устанавливать всю сетевую абстракцию внизу.   -  person Than    schedule 30.03.2017
comment
Более того, имея mockwebserver напрямую, ваши тесты докладчика получат знания о вашем источнике данных, кодах состояния HTTP и т. д. Presenter (и его тесты) как логика презентации не должны знать об этой информации.   -  person Than    schedule 30.03.2017
comment
@ Чем я работаю: gist.github.com/kkl260/cbd7ba20b20d7159b9abd39fabd3e9d3 Я хочу протестировать метод Presenter.signUp и в основном проверить, что если объект, который я отправляю, является объектом 201 User, то он переходит к onNext/onComplete (который достигнет MY метода onSignUpSuccess). Если я отправлю json с ошибкой 400, он вызовет onError. Вот что я ищу. Mockito.verify(view).showLoading(); Mockito.verify(view).signUpSuccessful(); Он успешно показывает загрузку, но по какой-то причине я получаю ошибку «нет интернета» и не регистрируюсь.   -  person kkl260    schedule 30.03.2017
comment
Что не так с when(mApi.signUpUser(<whatever criteria you want>)).thenReturn(Observable.just(<whatever user object you need in your test>))?   -  person Fred    schedule 04.04.2017
comment
Что-то, что я делал в своем ведущем, вызывало проблему. Я неправильно вводил свой API. Спасибо всем за помощь.   -  person kkl260    schedule 04.04.2017