单元测试回调函数

4

我正在尝试为应用程序中的一个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()内部发生了什么,但我不知道如何做。有什么方法可以实现吗?或者我应该重构我的代码以使其更易于测试?


请将您的解决方案发布为答案并标记为自我回答 :) - Michael Dodd
2个回答

3

找到了解决方案

我使用了 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());
}

0

听起来像是Mockito的verify()方法的一个好案例。暂时没有时间发布一个适当的示例,但可以看一下这篇文章:

Mockito - verify方法是什么?

另请参阅

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


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

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