Android上的单元测试事件总线
我已经看到了,但它并没有提供一个解决方案,我试图做什么 我正在使用EventBus(来自greenrobot)通过我的应用程序发送消息。我希望能够对我的应用程序进行单元测试,以确认消息已发布到总线上。就这样 下面是我想用一个发布消息的方法测试的类: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(
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,并且全部由一个单实例管理。谢谢你的澄清。