单元测试回调

问题描述 投票:0回答:2

我正在尝试在我的应用程序中为 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
,它有一个 OK 按钮,其
onClick
方法调用
ICallback.onConfirm

我想测试一下里面发生了什么

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

java android unit-testing mocking
2个回答
3
投票

找到解决办法了

我使用

ArgumentCaptor
捕获回调,然后调用回调的
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());
}

0
投票

听起来像是 Mockito 的 verify() 方法的一个很好的例子。目前没有时间发布正确的示例,但请看一下这篇文章:

Mockito - verify 方法有什么作用?

另请参阅

基本上,您需要在测试中模拟 ICallback 的实例,然后在单击“确定”按钮后,针对您的

verify()
方法调用
onConfirm()
。 (我假设您使用 Espresso 进行 UI 端单元测试)

© www.soinside.com 2019 - 2024. All rights reserved.