java - 如何在 Mockito 上验证满足多个条件中的一个?是否可以验证是否调用了一种或另一种方法?

标签 java android junit mockito

在我的单元测试中,我想检查是否调用了一个或另一个方法。多亏了 Mockito,我可以很容易地验证某些方法被调用了多少次,但是 verify 没有像“OR”这样的验证模式。任何解决方法?

在我的例子中,我想检查 SharedPreferences.Editor 是否被调用了 .apply().commit() 因为两个这种可能性让我满意并节省了数据。不幸的是,如果我调用 verify(mEditor).apply() 但由于即时保存的要求,有人会将示例中的实现更改为 .commit(),测试将失败,但不应该因为我只想从这个角度测试是否保存了数据。这是单元测试,应该独立于此类更改,并且仅检查内部测试内容的范围。

最佳答案

您要求的工作是捕获底层 MockitoAssertionError (或者只是 AssertionError):

try {
  verify(mEditor).apply();
} catch (MockitoAssertionError mae) {
  // apply was not called. Let's verify commit instead.
  verify(mEditor).commit();
}

或者,如果 applycommit 都调用了一些(内部)save 方法,您也可以尝试验证(假设它已公开 - - 基于模拟的测试可能与信息隐藏不一致)。或者,如果您可以控制您正在测试的代码,您可以按照这些行重构它。

不过,更好的建议是完全避免这种需要,正如 answer by @GhostCat 中所论证的那样.

关于java - 如何在 Mockito 上验证满足多个条件中的一个?是否可以验证是否调用了一种或另一种方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55560689/

相关文章:

java - 如何在Firebase实时数据库中使用onChildRemoved?

android - 是否存在适用于 Android 的相当于 IOS 的 SKStoreReviewController 的类?

java - SequenceGenerator 在 JUnit 测试中不起作用?

JUnit 测试中的 Kotlin 内联类

java - 有一个可以动态更改顺序的 Java Comparator 可以吗?

c# - stringToHex 和 hexToString C# 和 Android Java

java - 条件查询返回[]

java - ls 过滤 channel ftp

android - keytool 不适用于签署 android 应用程序

java - 如何断言一个列表至少有 n 个大于 x 的项目(在 junit 中使用 hamcrest)