Различное поведение на эмуляторе Android и JVM с использованием RxJava2 - PullRequest
0 голосов
/ 03 июня 2018

Вот фрагмент кода, который работает на эмуляторе Android, но не в тестах Junit.

 public void startObserving() {
    Observable.just(1, 2, 3, 40)
            .doOnNext(integer -> System.out.println("doOnNext item " + integer + " on: " + Thread.currentThread().getName()))
            .subscribeOn(Schedulers.computation())
            .observeOn(Schedulers.single())
            .subscribe(integer -> System.out.println("Consuming item " + integer + " on: " + Thread.currentThread().getName()));
}

Журналы в doOnNext () и subscribe () печатаются, когда я запускаю этот метод в эмуляторе Androidно не когда я запускаю его как тест JUnit.Может кто-нибудь из вас, удивительные люди, объяснить мне, чего мне здесь не хватает ...

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

RxJava выполняет потоки асинхронно, когда вы предоставляете операторы subscribeOn() и observeOn().Таким образом, тесты заканчиваются раньше, чем это делает поток.

Так что для целей тестирования вы должны синхронизировать поток.Вы можете достичь этого с помощью RxJavaPlugins, например:

RxJavaPlugins.setComputationSchedulerHandler(sc -> Schedulers.trampoline());
RxJavaPlugins.setSingleSchedulerHandler(sc -> Schedulers.trampoline());
0 голосов
/ 03 июня 2018

помните, что вы имеете дело с асинхронным кодом.тесты выполняются до завершения подписки.добавление оператора сна может проверить это:

@Test
public void startObserving() throws Exception {
    Observable.just(1, 2, 3, 40)
        .doOnNext(integer -> System.out.println("doOnNext item " + integer + " on: " + Thread.currentThread().getName()))
        .subscribeOn(Schedulers.computation())
        .observeOn(Schedulers.single())
        .subscribe(integer -> System.out.println("Consuming item " + integer + " on: " + Thread.currentThread().getName()));

    Thread.sleep(3000);
} 

надеюсь, что это поможет!

...