Android上的单元测试EventBus

时间:2018-09-10 12:08:59

标签: android unit-testing mockito greenrobot-eventbus-3.0

我已经见过this SO question,但它并不能为我要做的事情提供解决方案。

我正在使用EventBus(来自greenrobot)通过我的应用发送消息。我希望能够对我的应用进行单元测试,以确认一条消息已发布到公交车上。就是这样。

这是我想用一个发布消息的单一方法测试的类:

public class CxManager {
    public void postMessage(JsonObject data) {
        EventBus.getDefault().post(new MyCustomEvent(data));
    }
}

这是我尝试过但不起作用的测试:

@RunWith(MockitoJUnitRunner.class)
public class CxManagerTest {

    @Mock EventBus eventBus;
    private CxManager cxManager;
    private JsonObject testJsonObject;

    @Before public void setUp() throws Exception {
        cxManager = new CxManager();

        testJsonObject = new JsonObject();
        testJsonObject.addProperty("test", "nada");
    }

    @Test public void shouldPass() {
        cxManager.postMessage(testJsonObject);

        verify(eventBus).post(new MyCustomEvent(testJsonObject));
    }
}

我已经编写了该测试,甚至知道它很可能会失败,因为EventBus使用Singleton发布消息,而且我不知道如何测试正在执行的Singleton方法。

这也是一个大型项目的一部分。有关件。而且我想根据不同的交互方式来测试消息的正确发布

1 个答案:

答案 0 :(得分:2)

您的问题是CxManager张贴到的事件总线不是您的模拟对象。您必须重新组织代码,以直接或通过依赖项注入将EventBus传递到CxManager,以便将其发布到该eventBus,而不是现在获取它。

或者,获取其实际发布到的EventBus实例,然后订阅它。无需在此处实际模拟EventBus。