![](/img/trans.png)
[英]Unit Testing: How to verify and mock onCompleted for an Observable in RxJava within Android
[英]Android unit testing how to test observable and Subscriber
嗨以下是我想用各种请求测试的代码的一部分,但我无法测试,因为它是可观察的订阅者模式任何想法如何模拟订阅者或如何在单元测试中等待结果
api.loadData(request)
.observeOn(schedulers.main())
.doOnNext(this::addDataCheck)
.subscribe(
data -> onDataLodaded(listener, data),
e -> onAdFailedToLoad(listener, Api.error(request), e)
)
.addTo(disposables);
如果您有权访问 Observable,您可以使用 Observable 的test()
方法来获取TestObserver
或使用TestObserver
blocking*()
方法,如TestObserver
blockingSubscribe()
、 TestObserver
blockingFirst()
等。
在大多数情况下,您将无法访问它们,或者您已经对它们调用了subscribe()
。 那么答案取决于您使用的 JUnit 版本。
通常,您必须像这样更改 RxJava 和 RxAndroid 调度程序的处理程序:
RxJavaPlugins.setComputationSchedulerHandler(scheduler -> Schedulers.trampoline());
RxJavaPlugins.setIoSchedulerHandler (scheduler -> Schedulers.trampoline());
RxJavaPlugins.setSingleSchedulerHandler (scheduler -> Schedulers.trampoline());
RxJavaPlugins.setNewThreadSchedulerHandler (scheduler -> Schedulers.trampoline());
RxAndroidPlugins.setMainThreadSchedulerHandler(scheduler -> Schedulers.trampoline());
有了这个,您的所有任务都将在 JUnit 测试的测试线程上运行。
JUnit 4 使用Rule
来更改所有测试方法的行为,例如更改 RxJava 的调度程序,为此扩展TestRule
并根据需要实现方法。 规则是这样使用的:
public class TestClass {
@Rule public TestRule testRule = new MyTestRule();
// your tests
}
JUnit 5 使用Extension
代替Rule
将修改应用于所有测试方法。 例如,您可以使用此类:
import org.junit.jupiter.api.extension.BeforeAllCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import io.reactivex.rxjava3.android.plugins.RxAndroidPlugins;
import io.reactivex.rxjava3.plugins.RxJavaPlugins;
import io.reactivex.rxjava3.schedulers.Schedulers;
public class RxInstantExecutorExtension implements BeforeAllCallback {
@Override
public void beforeAll(ExtensionContext context) {
RxJavaPlugins.setComputationSchedulerHandler(scheduler -> Schedulers.trampoline());
RxJavaPlugins.setIoSchedulerHandler(scheduler -> Schedulers.computation());
RxJavaPlugins.setSingleSchedulerHandler(scheduler -> Schedulers.trampoline());
RxJavaPlugins.setNewThreadSchedulerHandler(scheduler -> Schedulers.trampoline());
RxAndroidPlugins.setMainThreadSchedulerHandler(scheduler -> Schedulers.trampoline());
}
}
在你的测试中是这样的:
@ExtendWith(RxInstantExecutorExtension.class)
public class TestClass { // your tests }
因为问题被标记为“android”,这里提醒一下,如果使用LiveData
的调度必须添加Rule
/ Extension
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.