我正在尝试在我的应用程序中为 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()
,但我不知道该怎么做。如何做到这一点?或者我应该以不同的方式构建我的代码,以便它对测试更加友好?
找到解决办法了
我使用
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());
}
听起来像是 Mockito 的 verify() 方法的一个很好的例子。目前没有时间发布正确的示例,但请看一下这篇文章:
基本上,您需要在测试中模拟 ICallback 的实例,然后在单击“确定”按钮后,针对您的
verify()
方法调用 onConfirm()
。 (我假设您使用 Espresso 进行 UI 端单元测试)