Android上的单元测试事件总线

Android上的单元测试事件总线,android,unit-testing,mockito,greenrobot-eventbus-3.0,Android,Unit Testing,Mockito,Greenrobot Eventbus 3.0,我已经看到了,但它并没有提供一个解决方案,我试图做什么 我正在使用EventBus(来自greenrobot)通过我的应用程序发送消息。我希望能够对我的应用程序进行单元测试,以确认消息已发布到总线上。就这样 下面是我想用一个发布消息的方法测试的类: public class CxManager { public void postMessage(JsonObject data) { EventBus.getDefault().post(new MyCustomEvent(

我已经看到了,但它并没有提供一个解决方案,我试图做什么

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


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

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


或者,获取其实际发布到的EventBus实例,并订阅它。这里不需要实际模拟EventBus。

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


或者,获取其实际发布到的EventBus实例,并订阅它。没有必要在这里模拟EventBus。

谢谢!因此,一种方法是将EventBus传递给CxManager构造函数。我试试看。我没有收到最后一部分“获取其实际发布到的EventBus实例并订阅”,您能解释一下吗?cx经理正在(或至少应该)从某个地方获得一个实际的事件总线并正在发布到该事件总线。如果你能得到它,你可以订阅它。这里真的不需要模仿哦我想我明白了。。。但我不知道如何实现它。你想让我订阅我正在发布的同一个事件,所以如果我收到的消息是因为它是发布的,对吗?这似乎是一种有趣的方式,也是我第一次尝试。但我所遵循的指导原则令人困惑和复杂。你能编辑你的答案并告诉我如何实现它吗?我也接受你的解决方案,因为即使你回答的第一部分我也可以解决我的问题,但我想尝试你建议的第二部分,没有模拟,我希望你订阅相同的总线。事件总线并不是所有事件都指向的全局事件。您可以创建任意多个总线实例。cx manager正在某处创建或从某处获取一个。如果你订阅了同一个实例,你就不需要模仿任何东西。您可以测试并查看是否调用了实际函数。无论哪种方法都有效,这取决于什么更容易。好吧!再次感谢!我认为EventBus就是EventBus,并且全部由一个单实例管理。谢谢澄清,谢谢!因此,一种方法是将EventBus传递给CxManager构造函数。我试试看。我没有收到最后一部分“获取其实际发布到的EventBus实例并订阅”,您能解释一下吗?cx经理正在(或至少应该)从某个地方获得一个实际的事件总线并正在发布到该事件总线。如果你能得到它,你可以订阅它。这里真的不需要模仿哦我想我明白了。。。但我不知道如何实现它。你想让我订阅我正在发布的同一个事件,所以如果我收到的消息是因为它是发布的,对吗?这似乎是一种有趣的方式,也是我第一次尝试。但我所遵循的指导原则令人困惑和复杂。你能编辑你的答案并告诉我如何实现它吗?我也接受你的解决方案,因为即使你回答的第一部分我也可以解决我的问题,但我想尝试你建议的第二部分,没有模拟,我希望你订阅相同的总线。事件总线并不是所有事件都指向的全局事件。您可以创建任意多个总线实例。cx manager正在某处创建或从某处获取一个。如果你订阅了同一个实例,你就不需要模仿任何东西。您可以测试并查看是否调用了实际函数。无论哪种方法都有效,这取决于什么更容易。好吧!再次感谢!我认为EventBus就是EventBus,并且全部由一个单实例管理。谢谢你的澄清。