嗨,以下是我想用各种请求测试的代码部分,但我无法测试,因为它是可观察的订阅者模式,不知道如何模拟订阅者或如何等待单元测试的结果
api.loadData(request)
.observeOn(schedulers.main())
.doOnNext(this::addDataCheck)
.subscribe(
data -> onDataLodaded(listener, data),
e -> onAdFailedToLoad(listener, Api.error(request), e)
)
.addTo(disposables);
如果你可以访问可观察量,你可以使用可观察的test()
方法来获取TestObserver
或使用blocking*()
方法,如blockingSubscribe()
、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 测试的测试线程上运行。
六月 4
JUnit 4 使用Rule
s 来更改所有测试方法的行为,例如更改 RxJava 的调度程序,为此扩展TestRule
并根据需要实现方法。规则的使用方式如下:
public class TestClass {
@Rule public TestRule testRule = new MyTestRule();
// your tests
}
请参阅官方维基或例如此处以获取有关Rule
的更多信息。
JUnit 5
JUnit 5 使用Extension
s 而不是Rule
s 对所有测试方法进行修改。例如,您可以使用此类:
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
。