返回

MockK 中 relaxed 的作用:控制模拟对象严格性

Android

MockK 中 relaxed 的作用

前言

在单元测试中,模拟框架允许我们创建模拟对象,以模拟真实对象的特定行为。MockK 是 Kotlin 中一个流行的模拟框架,它提供了一系列有用的选项来配置模拟对象的行为。其中一个重要的选项是 relaxed,它控制模拟对象的严格程度。

relaxed 的含义

relaxed 选项指定模拟对象是否应该在未配置的情况下强制执行方法调用,或者是否应该返回默认值。有两种可能的值:

  • relaxed = true: 模拟对象不会验证方法调用,并始终返回默认值。例如,如果模拟了一个 List 对象,则 get() 方法始终会返回 null,而无需验证索引。
  • relaxed = false(默认): 模拟对象将验证方法调用,并在未配置的情况下抛出异常。例如,如果模拟了一个 List 对象,则 get() 方法将在索引无效时抛出 IndexOutOfBoundsException

何时使用 relaxed = true

一般来说,建议仅在需要时才使用 relaxed = true。原因如下:

  • 降低严格性: 使用 relaxed = true 可以降低对模拟对象的严格性,使其更容易编写测试。
  • 返回默认值: 它确保未配置的方法返回默认值,而无需手动配置每个方法。
  • 提高性能: 它可以提高测试的性能,因为模拟对象无需验证方法调用。

何时使用 relaxed = false

另一方面,建议在以下情况下使用 relaxed = false

  • 严格验证: 当需要严格验证方法调用时,例如当测试依赖于特定方法顺序或参数时。
  • 检测未处理的方法调用: 使用 relaxed = false 可以检测未处理的方法调用,有助于确保测试的全面性。
  • 清晰度: 它可以使测试更加清晰,因为未配置的方法调用会抛出异常,从而明确地指出缺少配置。

真实世界的例子

假设我们有一个 Service 类,它依赖于一个 Repository 类。我们可以使用 MockK 来模拟这两个类,并使用适当的 relaxed 设置。

  • Repository 对于 Repository,我们可以使用 relaxed = true,因为我们不关心方法调用的具体顺序或参数。
  • Service 对于 Service,我们可以使用 relaxed = false,因为我们需要严格验证方法调用,以确保服务按预期执行。

总结

relaxed 选项是一个有用的工具,可以根据需要调整模拟对象的严格性。通过明智地使用 relaxed = truerelaxed = false,我们可以创建清晰、高效的单元测试,同时又不牺牲严格性或覆盖率。

常见问题解答

Q1:什么是模拟对象?
A:模拟对象是模拟真实对象的行为的虚拟对象。它们用于单元测试中,以隔离被测代码并控制其依赖项。

Q2:relaxed = true 和 relaxed = false 有什么区别?
A:relaxed = true 会导致模拟对象始终返回默认值,而无需验证方法调用。relaxed = false 会导致模拟对象验证方法调用,并在未配置的情况下抛出异常。

Q3:何时应该使用 relaxed = true?
A:当不需要严格验证方法调用时,例如当模拟对象用于模拟依赖项或提供默认行为时。

Q4:何时应该使用 relaxed = false?
A:当需要严格验证方法调用时,例如当测试依赖于特定方法顺序或参数时。

Q5:MockK 中还有什么其他有用的选项?
A:MockK 提供了各种其他选项,例如 everyverifyanswer,可以用于进一步配置和验证模拟对象。