2

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

api.loadData(request)
            .observeOn(schedulers.main())
            .doOnNext(this::addDataCheck)
            .subscribe(
                    data -> onDataLodaded(listener, data),
                    e -> onAdFailedToLoad(listener, Api.error(request), e)
            )
            .addTo(disposables);
4

1 回答 1

0

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

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

    // your tests
}

有关s的更多信息,请参阅官方 wiki或例如此处。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”,所以这里提醒一下,如果使用它,则必须添加用于调度的Rule/ 。ExtensionLiveData

于 2021-11-19T11:09:04.133 回答