繁体   English   中英

Android单元测试如何测试observable和Subscriber

[英]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

JUnit 4 使用Rule来更改所有测试方法的行为,例如更改 RxJava 的调度程序,为此扩展TestRule并根据需要实现方法。 规则是这样使用的:

public class TestClass {
    @Rule public TestRule testRule = new MyTestRule();

    // your tests
}

有关Rule的更多信息,请参阅官方 wiki或例如此处

JUnit 5

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM