0

Я играю с реализацией своих собственных наблюдаемых или переносом их с других языков для удовольствия и прибыли.Как тестировать не-RxJava наблюдаемые или асинхронные коды вообще?

Проблема, с которой я столкнулся, заключается в том, что очень мало информации о том, как правильно тестировать наблюдаемые или асинхронные коды в целом.

Рассмотрим следующий код теста:

// Create a stream of values emitted every 100 milliseconds 
// `interval` uses Timer internally 
final Stream<Number> stream = 
    Streams.interval(100).map(number -> number.intValue() * 10); 

ArrayList<Number> expected = new ArrayList<>(); 

expected.add(0); 
expected.add(10); 
expected.add(20); 

IObserver<Number> observer = new IObserver<Number>() { 
    public void next(Number x) { 
    assertEquals(x, expected.get(0)); 
    expected.remove(0); 
    if(expected.size() == 0) { 
     stream.unsubscribe(this); 
    } 
    } 
    public void error(Exception e) {} 
    public void complete() {} 
}; 

stream.subscribe(observer); 

Как только поток подписка, он излучает первое значение. onNext называется ... И тогда тест успешно завершается.

В JavaScript большинство тестовых фреймворков в настоящее время предоставляют необязательное обещание для тестового примера, что вы можете асинхронно вызывать на успех/сбой. Есть ли что-то подобное для Java?

ответ

1

Поскольку исполнение является асинхронным, вам нужно подождать до конца. Вы можете просто подождать некоторое время, по-старому моды

your_code 
wait(1000) 
check results. 

Или, если вы используете Наблюдаемые вы можете использовать TestSubscriber В этом примере вы можете увидеть, как имеющую операцию асинхронных мы будем ждать, пока наблюдатель не потребляют все элементы ,

@Test 
public void testObservableAsync() throws InterruptedException { 
    Subscription subscription = Observable.from(numbers) 
      .doOnNext(increaseTotalItemsEmitted()) 
      .subscribeOn(Schedulers.newThread()) 
      .subscribe(number -> System.out.println("Items emitted:" + total)); 
    System.out.println("I finish before the observable finish. Items emitted:" + total); 


    new TestSubscriber((Observer) subscription) 
      .awaitTerminalEvent(100, TimeUnit.MILLISECONDS); 
} 

Вы можете увидеть больше Асинхронные здесь примеры https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/scheduler/ObservableAsynchronous.java

+0

Проблема заключается в том, что 'TestSubscriber' ожидает RxJava-совместимый' Observer' который я не мог иметь :( – Mamut

+1

Проверьте апи, There'sa подрядчика TestSubscriber, который не требует Observable;), так что это просто как ожидание – paul

+0

Спасибо! Оно работает :) – Mamut

Смежные вопросы