Eventbus: 无法对使用 EventBus 的类进行单元测试

创建于 2017-02-07  ·  5评论  ·  资料来源: greenrobot/EventBus

我想为具有自己的 EventBus 实例的类编写一些单元测试,但它不起作用,因为 EventBus 在其构造函数中使用了 Android 的 Handler。 使用 Otto 我可以做到,但我想改用 EventBus。 有任何想法吗?

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 org.greenrobot.eventbus.EventBus.<init>(EventBus.java:111)
    at org.greenrobot.eventbus.EventBus.<init>(EventBus.java:104)
    (...)

Process finished with exit code 255

最有用的评论

@gsteigert我和我的团队在集成 GreenRobot Eventbus 时遇到了这个确切的问题。 我们想验证 eventbus 是否正在发布特定事件,而不是已发布事件的执行。

您可以通过反射和 mockito 模拟来实现这一点。

爪哇:

Field field = EventBus.class.getDeclaredField("defaultInstance");
if (!field.isAccessible()) field.setAccessible(true);
field.set(null, Mockito.mock(EventBus.class));

科特林:

val field = EventBus::class.java.getDeclaredField("defaultInstance")
if (!field.isAccessible) field.isAccessible = true
field.set(null, mock<EventBus>())

所有5条评论

您可能正在尝试使用本地单元测试。 但正如您所发现的,EventBus 依赖于一些 Android 功能。 因此,您必须改用在 Android 设备上运行
-ut

好,谢谢!

@gsteigert我和我的团队在集成 GreenRobot Eventbus 时遇到了这个确切的问题。 我们想验证 eventbus 是否正在发布特定事件,而不是已发布事件的执行。

您可以通过反射和 mockito 模拟来实现这一点。

爪哇:

Field field = EventBus.class.getDeclaredField("defaultInstance");
if (!field.isAccessible()) field.setAccessible(true);
field.set(null, Mockito.mock(EventBus.class));

科特林:

val field = EventBus::class.java.getDeclaredField("defaultInstance")
if (!field.isAccessible) field.isAccessible = true
field.set(null, mock<EventBus>())

感谢@jmholtan的回答,它对我

请注意,从3.1.1 EventBus 也适用于纯 Java 项目,也适用于 Android 本地单元测试。 但请注意,某些线程模式的行为可能有所不同。 -ut

此页面是否有帮助?
0 / 5 - 0 等级