【问题标题】:Unit test a callback单元测试回调
【发布时间】:2017-05-09 03:33:59
【问题描述】:

我正在尝试在我的应用程序中为 Presenter 编写单元测试,并且我有以下用例,我不知道应该如何编写单元测试。

interface ICallback
{
    void onConfirm(String str);
}

interface IPopup
{
    void show(ICallback callback);
}

class Presenter
{
    private IPopup m_popup;
    private String m_result;

    Presenter(IPopup popup)
    {
        m_popup = popup;
    }

    public String getResult() { return m_result; }

    void onClick()
    {
        m_popup.show(new ICallback()
        {
            @Override
            public void onConfirm(String str)
            {
                m_result = str;
            }
        });
    }
}

函数show 创建一个PopupWindow,它有一个确定按钮,其onClick 方法调用ICallback.onConfirm

我想测试onConfirm() 内部发生了什么,但我不知道如何去做。如何做到这一点?或者我应该以不同的方式构建我的代码,以便它对测试更友好?

【问题讨论】:

  • 将您的解决方案发布为答案并标记为自答 :)

标签: java android unit-testing mocking


【解决方案1】:

听起来像是Mockito's verify() 方法的好例子。目前没有时间发布一个合适的例子,但是看看这个帖子:

Mockito - what does verify method do?

See also

基本上,您需要在测试中模拟 ICallback 的实例,然后在单击 OK 按钮后,针对您的 onConfirm() 方法调用 verify()。 (我假设您使用 Espresso 进行 UI 端单元测试)

【讨论】:

  • 谢谢。我实际上找到了一个解决方案,使用“ArgumentCaptor”并调用回调的onConfirm() 方法,然后验证结果。我可以在新年后为未来的读者发布代码。模拟 ICallback 不是一个选项,因为它没有注入到演示者中。演示者在调用 show() 方法时创建内联回调。
【解决方案2】:

找到解决方案

我使用ArguementCaptor 捕获回调,然后调用回调的onConfirm 方法并验证它是否有效。

@Mock IPopup m_popup;

@Test
public void callbackTest()
{
    String str = "test";
    ArgumentCaptor<ICallback> argument = ArgumentCaptor.forClass(ICallback.class);

    m_presenter.onClick();
    verify(m_popup).show(argument.capture());

    argument.getValue().onConfirm(str);
    assertEquals(str, m_presenter.getResult());
}

【讨论】:

    猜你喜欢
    • 2017-03-19
    • 1970-01-01
    • 2018-01-20
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 2017-12-22
    相关资源
    最近更新 更多