Retrofit + RxJava + Unit test

256
18 октября 2017, 04:50

Есть unit test для Retrofit запросы щас мне возвращают типизированые ответы от сервера Call<List<GroupObject>> в таком виде достаточно просто его тестировать:

    GroupObject group = new GroupObject("Test group", "short name", "image/logo/ava.img", GroupCategory.AUTO_MOTO, this.USER_ID);
    String json = this.gson.toJson(group);
    Response<GroupObject> insertResponse = this.groupApi.insertNewGroup(json).execute();
    GroupObject insertedGroup = insertResponse.body();
    assertEquals("Request successful", 200, insertResponse.code());
    assertNotNull("Body is not empty", insertedGroup);
    assertNotNull("Id must not be null", insertedGroup.getId());
    Response<List<GroupObject>> getResponse = this.groupApi.getGroups().execute();
    List<GroupObject> all = getResponse.body();
    assertEquals("Request successful", 200, getResponse.code());
    assertNotNull("Body is not empty", all);
    assertTrue("List of groups must containst minimum one group which was created above",
            all.stream().anyMatch(object -> {
                return object.getId() != null && object.getId().equals(insertedGroup.getId());
            })
    );

Но я хочу вместо:

Call<List<GroupObject>> getGroups();

использовать:

Observable<List<GroupObject>> getGroups();

Но не могу понять как написать аналогичный тест, но для Observable.

Нашел вопрос относящийся к этой теме, но не до конца понимаю как получить аналогичный тесты при использовании Observable.

Дополнительно помимо JUnit добавил зависимости Mockito.

Подскажите, как можно реализовать аналогичный тест но с использованием Observable.

Answer 1

У вас в тесте логика завязана на обработке объекта Response. Адаптер Retrofit2 для RxJava2 может возвращать как Observable<T>, так и Observable<Response<T>>. Второй случай больше похож на ваш, тогда тип возвращаемого значения из api будет Observable<Response<List<GroupObject>>> или Single<Response<List<GroupObject>>>, тут уж как удобнее. Для тестирования реактивных источников можно воспользоваться специальным классом TestObserver, тогда тест может выглядеть примерно так:

    TestObserver<Response<List<GroupObject>>> testObserver = TestObserver.create();
    groupApi.getGroups().subscribe(testObserver);
    testObserver.assertNoErrors();
    testObserver.assertComplete();
    assertTrue(testObserver.valueCount() > 0);
    Response<List<GroupObject>> getResponse = testObserver.values().get(0);
    List<GroupObject> all = getResponse.body();
    assertEquals("Request successful", 200, getResponse.code());

PS В своем ответе я помогаю с написанием аналогичного теста, который использует автор, за корректность такого рода тестов я не отвечаю. =)

READ ALSO
Для чего нужны переменные счетчики

Для чего нужны переменные счетчики

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

239
Как сделать рестарт активити?

Как сделать рестарт активити?

Добрый деньВ приложении есть метод который делает много чего

235
Поддержка MIME type application/stream+json в Angular2

Поддержка MIME type application/stream+json в Angular2

С выходом новой версии Spring 5 появился модуль WebFlux(реактивный подход)В документации в пункте 23

245
Фейл ajax запроса в контроллере

Фейл ajax запроса в контроллере

Как сделать fail ajax запроса в контроллере,чтобы после обработать его по параметру OnFailure?

196