【问题标题】:How to/Should I unit test EventBus events with Mockito?如何/应该使用 Mockito 对 EventBus 事件进行单元测试?
【发布时间】:2016-03-23 13:38:10
【问题描述】:

我在我的 Android 应用中使用 Otto 的 EventBus。

在我的LoginNetworkOperation 类中,我捕获了不同类型的网络连接错误,并为每个错误发布了不同的总线事件,并且我的LoginPresenter 类被注册为侦听器并在触发这些事件时调用某些方法.

我的问题是如何(并且应该)对LoginNetworkOperation 是否引发此事件进行单元测试,而LoginPresenter 是否使用Mockito 处理它?

我查看了这个问题: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
    }
}

另外,这里应该是Subject Under Test,哪个应该是模拟对象?

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

【问题讨论】:

    标签: android unit-testing mockito


    【解决方案1】:

    我的问题是我如何(并且应该)对 LoginNetworkOperation 抛出此事件,LoginPresenter 处理它 用 Mockito 吗?

    这已经是一个集成测试:您正在组合各个软件模块并作为一个组来验证它们的行为。

    在这种情况下,“被测对象”是 LoginNetworkOperationEventBusLoginPresenter 的组合,模拟对象是 LoginNetworkOperation 的输入以及处理 LoginPresenter 输出的任何对象。


    这三个软件模块也可以进行单元测试:

    • LoginNetworkOperation.execute:模拟 EventBus 并验证它是否针对不同的输入使用正确的 ExceptionEvent 调用。
    • LoginPresenter.onExceptionEvent:验证不同 ExceptionEvents 的正确行为。
    • EventBus.post:注册一个模拟的ExceptionEvent-Handler,发布一个ExceptionEvent并检查该Handler是否被调用。

    【讨论】:

    • 这样我就可以注册一个 Mock 来监听事件总线事件并让 EventBus 发布一个事件,并且该模拟应该接收它?
    • 在我提到的哪些测试中,EventBus.post 单元测试?如果是这样,是的。
    • 但是关于不嘲笑我们不拥有的类的建议呢? EventBus 是一个 3rd 方库,所以嘲笑它有点违反这条不成文的法律。
    猜你喜欢
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多