我正在尝试使用MVP来增强单元测试并更快地运行测试(因为我正在测试逻辑而不是android代码,因此避免使用RobotElectric之类的东西)。

但是我使用的是RXAndroid,它需要Looper来获取Schedulers.io()AndroidSchedulers.mainThread(),并且在我尝试运行类似

class Phone {
    public Observable<> sendSms(String number){
        //...
    }
}

Phone.getInstance().sendSms(phoneNumber)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(phone -> {
                    mView.dismissProgress();
                    mView.startCodeView(phone);
                }, error -> {
                    mView.dismissProgress();
                    mView.showError(error);
                });

我得到:
Caused by: java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked. See http://g.co/androidstudio/not-mocked for details.
at android.os.Looper.getMainLooper(Looper.java)
at rx.android.schedulers.AndroidSchedulers.<clinit>(AndroidSchedulers.java:27)
... 28 more

我试过了:
android {
  // ...
  testOptions {
    unitTests.returnDefaultValues = true
  }
}

但这不会起作用,因为我想运行完整的JUnit测试,而不是Roboelectric或Espresso之类的东西。

我该怎么做?有没有因此而不会崩溃的调度程序?

最佳答案

我也在为此使用调度程序线程,但是在我的测试SetUp和TearDown中。

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

@After
public void tearDown() {
    RxAndroidPlugins.getInstance().reset();
}

请问有帮助吗?

10-08 19:50