【问题标题】:How to test non-RxJava observables or async code in general?通常如何测试非 RxJava 可观察对象或异步代码?
【发布时间】:2016-08-18 16:05:22
【问题描述】:

我正在尝试实现自己的 observables 或从其他语言移植它们以获得乐趣和利润。

我遇到的问题是关于如何正确测试可观察对象或一般异步代码的信息很少。

考虑以下测试代码:

// 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 中,大多数测试框架都为测试用例提供了一个可选的 Promise,您可以在成功/失败时异步调用它。 Java有类似的东西吗?

【问题讨论】:

    标签: java unit-testing testing asynchronous reactive-programming


    【解决方案1】:

    由于执行是异步的,您必须等到完成。你可以用老式的方式等待一段时间

     your_code
     wait(1000)
     check results.
    

    或者如果你使用 Observables,你可以使用 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

    【讨论】:

    • 问题是 TestSubscriber 需要一个与 RxJava 兼容的 Observer,而我可能没有:(
    • 检查 api,TestSubscriber 的承包商不需要 Observable ;),所以基本上就像等待
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    相关资源
    最近更新 更多