我正在尝试使用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();
}
请问有帮助吗?