2016-04-15 28 views
6

我想测试使用RxJava从交互器中检索数据的演示者。在设置方法,我做这样的事情:Schedulers.immediate()不能用于命令行Gradle测试

@Before 
public void setup() { 
    RxAndroidPlugins.getInstance().registerSchedulersHook(new RxAndroidSchedulersHook() { 
     @Override 
     public Scheduler getMainThreadScheduler() { 
      return Schedulers.immediate(); 
     } 
    }); 
} 

所以在我的测试方法我可以测试演示电话:

@Test 
public void testLoad() { 
    presenter.load(); 
    verify(view).dataLoaded(data); 
    verify(interactor).load(); 
} 

如果我运行了Android工作室一切工作的测试不如预期,问题是,如果我尝试在命令行

gradle test 

然后测试失败,因为: Actually, there were zero interactions with this mock.

所以我试图把一个Thread.sleep(2000)在对主讲者的调用之后立即工作,所以我猜Schedulers.immediate();不是从命令行工作,但我不知道为什么以及如何调试/修复。你有什么主意吗?

编辑:主持人实施 - >

public void load() { 
    Observable<List<Data>> obs = interactor.load() 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribeOn(Schedulers.io()); 
    obs.subscribe(new Observer<List<Data>>() { 
     @Override 
     public void onCompleted() { 

     } 

     @Override 
     public void onError(Throwable e) { 

     } 

     @Override 
     public void onNext(List<Data> data) { 
      view.dataLoaded(data); 
     } 
    }); 
} 
+0

你可以在'getMainThreadScheduler'中添加一些日志来检查它是否被调用?您的代码中可能有其他竞争条件。在代码中显示如何使用调度程序会很棒。 – zsxwing

+0

您的'load'实现是异步的(在Schedulers.io()中订阅)。因此,你不应该在立即调用'load'之后进行验证。 – zsxwing

+0

是的你是对的,我实际上已经解决了在演示者中删除rxjava的所有依赖关系,所以有一个调用rxjava的包装,但是在测试中我使用了不使用rxjava的不同包装。最后,我不想测试rxjava,但我的演示者的逻辑:) –

回答

0

你可以嘲笑RxJava调度程序也是如此。

RxJavaHooks.reset(); 
RxJavaHooks.setOnIOScheduler(scheduler -> Schedulers.immediate()); 

通常一个好东西叫重置设置&拆卸。