使用 SafeArgs 和 Mockito 测试导航组件

Test Navigation Component with SafeArgs and Mockito

我正在尝试测试片段 A 是否通过导航组件的 navigate(NavDirection) 方法调用片段 B,并使用 Mockito。问题是从片段 A 到片段 B 的操作具有安全参数(确切地说是一个对象),并且在尝试执行以下操作时:

verify(navController).navigate(FragmentADirections.actionFragmentAToFragmentB(payload))

Mockito 抛出“参数不同!”错误,调用之间的区别是 payload 的实例。我在这里做的是这个片段 A 的(模拟)视图模型接收启动片段的 activity 的额外意图(使用 launchFragmentInHiltContainer 辅助方法),并从中捕获有效负载对象(这个对象是然后在 FragmentADirection 的操作方法的参数中使用)。这是创建“其他实例”的时刻,但我不需要 Mockito 来验证实例的相等性,而是我只需要检查片段 A 调用是否正确导航到片段 B。

有没有办法使用 Mockito 实现此目的?

代码流:

  1. 片段 A 调用视图模型,传递它的 activity 引用
  2. viewmodel 使用有效载荷捕获 intent.extras
  3. viewModel 调用 navigate 方法传递上一步捕获的 payload

P.S.: 我正在使用 Hilt,我正在以这种方式初始化我的模拟 navController 实例:

private val navController = mock(NavController::class.java)

虽然我没有找到让 Mockito 检查负载数据而不是实例之间的差异的方法,但我再次尝试使用 TestNavHostController 作为@ianhanniballake 的建议,并且在重构代码时我注意到当我正在检查视图中的文本,而不是使用 R.string 我使用的是 R.id,这导致测试失败。现在我已经更正了,一切似乎都很好。

因此,对于这种情况,请在查看 navController.currentDestination?.id 值之前检查您是否在做一些错误的断言。