gpt4 book ai didi

android - 如何单元测试 FragmentDialog 和实现接口(interface)的 Activity 之间的交互

转载 作者:行者123 更新时间:2023-11-29 20:30:12 25 4
gpt4 key购买 nike

我有 MainActivity 显示 FragmentDialog (EditIntervalFragment) 以捕获用户的输入。 Activity 实现 EditIntervalListener 接口(interface)。在 onAtach 方法中, fragment 将 Activity 转换为 EditIntervalListener。我想测试我的 EditIntervalFragment 是否使用正确的参数正确调用了 EditIntervalListener 方法。

我最初的 Intent 是使用 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 的方法。我创建了另一个 Activity ,仅用于测试。

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

寻求帮助。我该如何实现此类测试?

最佳答案

当您不控制生命周期时,让工作成为 spy 总是很困难的。

我们通常做的是将所有不相关的功能提取到实用程序类并在测试中模拟它们。它还有助于应用程序的设计(单一类责任规则)。

当然,这取决于您是否对这些数据进行处理。如果它只是数据类,那么我将使用 Factory 创建此数据类并在测试中再次模拟它。所有这些都需要适当的 DI(看看 Dagger)。

您的方法没有任何问题,但它不会强制您将您的应用程序视为相互交互的小部件。但与此同时,它带来了更多的复杂性,这会在以后得到返回

关于android - 如何单元测试 FragmentDialog 和实现接口(interface)的 Activity 之间的交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32116424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com