我在尝试为使用 observeOn(AndroidSchedulers.mainThread())
的演示者运行 JUnit 测试时遇到 RuntimeException。
由于它们是纯 JUnit 测试而不是 Android 仪器测试,它们无法访问 Android 依赖项,导致我在执行测试时遇到以下错误:
java.lang.ExceptionInInitializerError
at io.reactivex.android.schedulers.AndroidSchedulers$1.call(AndroidSchedulers.java:35)
at io.reactivex.android.schedulers.AndroidSchedulers$1.call(AndroidSchedulers.java:33)
at io.reactivex.android.plugins.RxAndroidPlugins.callRequireNonNull(RxAndroidPlugins.java:70)
at io.reactivex.android.plugins.RxAndroidPlugins.initMainThreadScheduler(RxAndroidPlugins.java:40)
at io.reactivex.android.schedulers.AndroidSchedulers.<clinit>(AndroidSchedulers.java:32)
…
Caused by: java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked. See http://g.co/androidstudio/not-mocked for details.
at android.os.Looper.getMainLooper(Looper.java)
at io.reactivex.android.schedulers.AndroidSchedulers$MainHolder.<clinit>(AndroidSchedulers.java:29)
...
java.lang.NoClassDefFoundError: Could not initialize class io.reactivex.android.schedulers.AndroidSchedulers
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
…
原文由 starkej2 发布,翻译遵循 CC BY-SA 4.0 许可协议
发生此错误是因为 --- 返回的默认调度程序是
LooperScheduler
AndroidSchedulers.mainThread()
的一个实例,并且依赖于 JUnit 测试中不可用的 Android 依赖项。我们可以通过在运行测试之前用不同的调度程序初始化
RxAndroidPlugins
来避免这个问题。您可以在@BeforeClass
方法中执行此操作,如下所示:或者您可以创建自定义
TestRule
允许您在多个测试类中重用初始化逻辑。然后您可以将其应用于您的测试课程
这两种方法都将确保在执行任何测试之前和访问
AndroidSchedulers
之前覆盖默认调度程序。使用用于单元测试的即时调度程序覆盖 RxJava 调度程序还将确保被测试代码中的 RxJava 用法同步运行,这将使编写单元测试变得更加容易。
资料来源:
https://www.infoq.com/articles/Testing-RxJava2 https://medium.com/@peter.tackage/overriding-rxandroid-schedulers-in-rxjava-2-5561b3d14212