【发布时间】:2015-08-20 10:58:12
【问题描述】:
我有 MainActivity 显示 FragmentDialog (EditIntervalFragment) 以捕获用户的输入。 Activity 实现了EditIntervalListener 接口。在onAtach 方法片段中将活动转换为EditIntervalListener。
我想测试我的EditIntervalFragment 是否正确调用具有正确参数的EditIntervalListener 方法。
我最初的意图是使用 Roblectric 和 Mockito。下面的代码几乎可以工作。
@Test
public void shouldCallInterfaceAfterModify() {
MainActivity hostActivity = Robolectric.setupActivity(MainActivity.class);
EditIntervalFragment editIntervalFragment = EditIntervalFragment.getInstance(0, TEST_NAME, TEST_DURATION);
editIntervalFragment.show(hostActivity.getSupportFragmentManager(), "test");
AlertDialog dialog = (AlertDialog) editIntervalFragment.getDialog();
assertNotNull(dialog);
EditIntervalFragment.EditIntervalListener activity = Mockito.spy(hostActivity);
dialog.findViewById(android.R.id.button1).performClick();
verify(activity).onIntervalChanged(0,TEST_NAME,TEST_DURATION);
}
这个代码的问题是它使用了真正的MainActivity。这意味着将执行所有MainActivity 的逻辑。我想避免这种情况。我该怎么做?
更新
我找到了一种不调用真实MainActivity 的方法。我创建了另一个活动,只是为了测试。
public class ActivityTest extends FragmentActivity implements EditIntervalFragment.EditIntervalListener {
//empty methods here
}
我的测试现在看起来像这样
@Test
public void shouldCallInterfaceAfterModify() {
ActivityTest hostActivity = Robolectric.setupActivity(ActivityTest.class);
ActivityTest spy = Mockito.spy(hostActivity);
EditIntervalFragment editIntervalFragment = EditIntervalFragment.getInstance(0, TEST_NAME, TEST_DURATION);
editIntervalFragment.show(spy.getSupportFragmentManager(), "test");
AlertDialog dialog = (AlertDialog) editIntervalFragment.getDialog();
assertNotNull(dialog);
dialog.findViewById(android.R.id.button1).performClick();
verify(spy).onIntervalChanged(0, TEST_NAME, TEST_DURATION);
}
但在测试执行后,我收到错误消息说只有spy.getSupportFragmentManager() 被调用。我 100% 确定应该调用 onIntervalChanged。
寻求帮助。我怎样才能实现这样的测试?
【问题讨论】:
标签: android mockito robolectric android-testing