Android 单元测试如何测试可观察和订阅者



嗨,以下是我想用各种请求测试的代码部分,但我无法测试,因为它是可观察的订阅者模式,不知道如何模拟订阅者或如何等待单元测试的结果

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 使用Rules 来更改所有测试方法的行为,例如更改 RxJava 的调度程序,为此扩展TestRule并根据需要实现方法。规则的使用方式如下:

public class TestClass {
@Rule public TestRule testRule = new MyTestRule();
// your tests
}

请参阅官方维基或例如此处以获取有关Rule的更多信息。

JUnit 5

JUnit 5 使用Extensions 而不是Rules 对所有测试方法进行修改。例如,您可以使用此类:

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",所以这里提醒一下,如果使用它,则必须添加用于调度LiveDataRule/Extension

相关内容

  • 没有找到相关文章

最新更新