如何/我应该如何使用Mockito对EventBus事件进行单元测试?

4
我在我的Android应用中使用Otto的EventBus。
在我的LoginNetworkOperation类中,我捕获不同类型的网络连接错误,并为每个错误发布不同的总线事件,我的LoginPresenter类注册为监听器,当这些事件被触发时,特定的方法将被调用。
我的问题是,我应该如何(并且应该)使用Mockito单元测试LoginNetworkOperation是否抛出此事件,并且LoginPresenter是否处理它?
我查看了这个问题:Guava EventBus unit tests,但它没有提供足够的信息,特别是在实现部分。
public class LoginNetworkOperation {

    public void execute(String username, String password) {
        try {
            // retrofit attempt
        } catch (Exception e) {
            bus.post(new ExceptionEvent(e));
        }
    }
}

public class LoginPresenter {

    void onExceptionEvent(ExceptionEvent exceptionEvent) {
        // Do Something with the exception event
    }
}

此外,在这里应该是哪个被测试的对象,哪个是模拟对象?

我在Android Studio中使用JUnit+Mockito+Robolectric,我的测试工件是单元测试

1个回答

2
我的问题是如何(以及是否应该)使用Mockito进行单元测试,以测试LoginNetworkOperation是否会抛出此事件并且LoginPresenter是否能够处理它?
这已经是一个集成测试:您正在将单个软件模块组合在一起,并验证它们作为一组的行为。在这种情况下,“测试对象”是LoginNetworkOperation,EventBus和LoginPresenter的组合,而模拟对象则是LoginNetworkOperation的输入以及任何处理LoginPresenter输出的内容。
这三个软件模块也可以进行单元测试:
1. LoginNetworkOperation.execute:模拟EventBus并验证对于不同的输入,它是否使用正确的ExceptionEvent被调用。 2. LoginPresenter.onExceptionEvent:验证对于不同的ExceptionEvents,是否有正确的行为。 3. EventBus.post:注册一个模拟的ExceptionEvent-Handler,发布一个ExceptionEvent,并检查Handler是否被调用。

我可以注册一个Mock来监听事件总线的事件,让EventBus发布一个事件,这个Mock应该接收到它吗? - Kaloyan Roussev
在我提到的测试中,是否包括EventBus.post单元测试?如果是,那么是的。 - Bewusstsein
但是关于不嘲笑我们不拥有的类的建议呢?EventBus是一个第三方库,所以嘲笑它有点违反这个不成文的规定。 - Oleksandr Berdnikov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接