Rx异步未执行

时间:2015-12-05 16:19:41

标签: java rx-java

希望与RxJava执行请求异步。但是可以执行Request.add()。你能帮助我通过这个junit吗?

public class Rizze_debug_Rxjava_Test extends METRICS_JUNIT{


    @Test 
    public void testR2_JEOR(){

        logger.info("trace 1 ");        
        Observable<String> obs = Observable.create((Subscriber<? super String> s) -> {
            try {

                logger.info("//processsing");       
                Request.add();
            } catch (Exception e) {
                e.printStackTrace();
                s.onError(e);
            }       

            logger.info("//done");
            s.onNext("done");
            s.onCompleted();
        });
        logger.info("trace 2"); 
        obs.subscribeOn(Schedulers.io());


        assertEquals(1,Request.i);
        logger.info("trace 3"); 
    }


    public static class Request{
        public static int i =0;
        public static void add(){
            i++;
        }
    }


}

2 个答案:

答案 0 :(得分:2)

像这样的Observable本身就是描述你想要执行的异步处理管道。它是一个冷Observable,它在订阅之前不会开始发送数据,所以你需要调用一种形式的订阅或其他形式。

请注意,这里的排放在订阅时会非常快,因为它基本上会在订阅时执行循环,但对于可以发出延迟项的真正异步进程,这种只调用subscribe()的方法不会因为控件将立即返回到测试中的下一行,这可能会在异步处理发生之前终止。

对于这些情况,有一个特殊的Subscriber,即TestSubscriber,它允许您阻止测试直到Observable完成或出错,然后断言排放/错误。你应该调查它!

答案 1 :(得分:0)

我们必须订阅()才能运行它:

public class Rizze_debug_Rxjava_Test extends METRICS_JUNIT {

    @Test
    public void testR2_JEOR() {

        logger.info("trace 1 ");
        Observable<String> obs = Observable.create((Subscriber<? super String> s) -> {
            try {

                logger.info("//processsing");
                Request.add();
            } catch (Exception e) {
                e.printStackTrace();
                s.onError(e);
            }

            logger.info("//done");
            s.onNext("done");
            s.onCompleted();
        });
        logger.info("trace 2");
        obs.subscribeOn(Schedulers.io()).subscribe();

        assertEquals(1, Request.i);
        logger.info("trace 3");
    }

    public static class Request {
        public static int i = 0;

        public static void add() {
            i++;
        }
    }
}