如果您有权访问 Observable,则可以使用test()
Observable 的方法来获取 aTestObserver
或使用,等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 测试的测试线程上运行。
JUnit 4
JUnit 4 使用Rule
s 来更改所有测试方法的行为,例如更改 RxJava 的调度程序,为此扩展TestRule
并根据需要实现方法。规则是这样使用的:
public class TestClass {
@Rule public TestRule testRule = new MyTestRule();
// your tests
}
有关s的更多信息,请参阅官方 wiki或例如此处。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”,所以这里提醒一下,如果使用它,则必须添加用于调度的Rule
/ 。Extension
LiveData