单元测试回调

时间:2016-12-23 12:09:39

标签: java android unit-testing mocking

我正在尝试在我的应用程序中为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()内发生的事情,但我不知道如何去做。怎么做到这一点?或者我应该以不同的方式构建我的代码,以便它更友好地测试?

2 个答案:

答案 0 :(得分: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());
}

答案 1 :(得分:0)

听起来像Mockito's verify()方法的好例子。现在没时间发布一个正确的例子,但看看这篇文章:

Mockito - what does verify method do?

See also

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