【问题标题】:Unit Test EventBus on AndroidAndroid 上的单元测试 EventBus
【发布时间】:2018-09-10 12:08:58
【问题描述】:

我已经看过 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 使用单例来发布消息,而我不知道如何测试正在执行的单例方法。

另外,这只是一个大型项目的一部分。相关的部分。并且我想根据不同的交互来测试消息的正确发布

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!因此,一种方法是将 EventBus 传递给 CxManager 构造函数。我会试试的。我没有得到最后一部分“获取它实际发布到的 EventBus 的实例,并订阅它”你能解释一下吗?
    • cx 经理正在(或至少应该)从某个地方获取实际的事件总线并发布到该总线。如果你能得到它,你可以订阅它。这里真的不需要模拟
    • 哦,我想我明白了……但不知道如何实现它。您希望我订阅我发布的同一事件,所以如果我收到该消息是因为它已发布,对吗?这似乎是一种有趣的方式,也是我的第一次尝试。但是我遵循的指导方针令人困惑和复杂。你能编辑你的答案并告诉我如何实现它吗?我也接受你的解决方案,因为即使你回答的第一部分我也可以解决我的问题,但我想按照你的建议尝试第二部分,没有模拟
    • 不,我希望您订阅同一辆巴士。事件总线并不是所有事件都会用到的全局性东西。您可以根据需要创建任意数量的总线实例。在某个地方,cx 经理正在创建一个,或者从某个地方抓取一个。如果您订阅了同一个实例,则无需模拟任何内容。您可以测试并查看是否调用了实际函数。无论哪种方式都有效,这取决于哪种方式更容易。
    • 好的!再次感谢!我认为 EventBus 是 THE EventBus 并且全部由单例实例管理。感谢您的澄清。
    猜你喜欢
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多