Wiremock 与 Mockito
Mockito 构建于单元测试,而 Wiremock 专为集成测试而构建。Mockito 自称“一个味道极佳的模拟框架”,而 Wiremock 将自己描述为“基于 HTTP 的 API 模拟器”。
Wiremock 和 mockito 都是用于测试的技术,广泛应用于现实世界应用程序的单元和集成测试中。开发人员必须了解这两个重要的术语以及它们之间的区别,以便有效地使用它们。
因此,本文将详细介绍这两个广泛使用的工具之间的主要区别。
什么是 Wiremock?
Wiremock 是一种用于模拟基于 HTTP 的 API 的工具,可以在单元测试、桌面或称为 Wiremock 的测试环境中使用。它也可以称为伪造服务器、服务虚拟化工具或基于 HTTP 的 API 模拟器。如果依赖的 API 出现以下情况,它允许您继续工作:
故障
昂贵
不可用
不完整
它有助于测试边缘情况和故障模式。它运行速度快,大大缩短了构建时间。简单来说,Wiremock 是一个用于集成测试的模拟平台。当系统与一个或多个内部/外部组件或设施交互时,尤其是在实施集成测试时,它主要被使用。
示例
例如,我们正在构建一个名为 Musizz 的应用程序,并且该应用程序中有一个功能需要连接到其他音乐应用程序(如 Ganna、Spotify 等)提供的外部 API。但这里的问题是如何对外部 API 进行集成测试。因此,将有两种方法可以解决这个问题。
方法
方法 1
这种方法非常明显。这意味着我们可以使用多个测试环境或实际生产环境对其进行测试。但这种方法也带来了一些挑战:
有时调用 API 成本很高
外部 API 系统可能并非始终可用,这意味着我们完全依赖于系统中的任何停机时间
有时,它不包含测试环境
图 1
方法 2
第二种方法是使用一个 Web 服务器,该服务器可以模拟对依赖项接收到的请求的响应。
图 2
什么是 Mockito?
同样,Mockito 是一个用于在 Java 应用程序中测试开源单元的框架。它对于创建可测试的应用程序至关重要。专注于评估特定软件单元的软件测试称为单元测试。使用此框架的主要目的是通过在测试代码中使用外部依赖项的模拟来简化测试开发。结果,mockito 提供了更优化、更易访问和更具适应性的测试代码。它还可以与 JUnit 和 TestNG 等其他框架协作。
方法
Mockito 模拟提供了许多不同的模拟类的方法。其中一些列在下面:
方法 1
可以使用它创建特定类或接口的模拟对象。Mockito 中有五个 mock() 方法,每个方法都有一个唯一的参数。如果我们没有为模拟对象分配任何内容,它们将返回默认值。所有五种技术都执行相同的模拟对象任务。
下面列出了所有五个 mock() 方法
使用 Class 的 mock()
它用于开发具体接口的模拟对象。它将接口名称作为参数。
语法
<T> mock(Class<T> classToMock)
使用 Answer 的 mock()
它用于使用特定过程开发接口的模拟对象。这是一种高级模拟方法,在处理遗留系统时可能很有用。它将 Answer 作为参数以及接口名称一起使用。Answer 是预配置模拟答案的枚举。
语法
<T> mock(Class<T> classToMock,Answer defaultAnswer)
使用 MockSettings 的 mock()
它用于使用一些非标准设置开发模拟对象。它将 MockSettings 作为附加设置参数以及接口名称一起使用。它允许创建具有附加设置的模拟对象。
语法
<T> mock(Class<T> classToMock,MockSettings mockSettings)
使用 ReturnValues 的 mock()
它允许创建已分配接口的模拟对象。现在,它已弃用,因为 ReturnValues 已被 Answer 替换。
语法
<T> mock(Class<T> classToMock,ReturnValues returnValues)
使用 String 的 mock()
它用于通过指定模拟名称来开发模拟对象。在调试过程中,命名模拟对象可能会有所帮助,而在大型复杂代码中使用它则不是一个好选择。
语法
<T> mock(Class<T> classToMock,String name)
以下代码展示了如何使用 mock() 方法:
ToDoService doService = mock(ToDoService.class);
方法 2
Mockito 提供的 spy 方法是一种仅部分模拟对象的方法。在使用 spy 方法时,将从已存在的真实对象中创建间谍或存根。在不使用 spy 存根方法的情况下,将调用真实方法的行为。spy() 方法的主要目的是覆盖真实对象的唯一方法。spy() 方法执行的任务之一是验证特定方法的调用。
Mockito 有两种 spy() 方法:
spy() 方法
它开发真实对象的间谍。除非存根,否则它会调用真实方法。我们应该谨慎且很少使用真实间谍。例如,在处理遗留代码时。
语法−
<T> spy(T object)
使用 Class 的 spy() 方法
它在类而不是对象上开发一个间谍对象。spy(T object) 方法对于监视抽象类特别有用,因为它们无法实例化。
语法
<T> spy(Class<T> classToSpy)
以下代码展示了如何使用 spy() 方法:
ListspyArrayList = spy(ArrayList.class);
为什么我们应该使用 Wiremock 而不是 Mockito?
对于基于 HTTP 的 API,Wiremock 提供了一个模拟器,而 Mockito 提供了特征或项目的模拟模型。如果我们的目标是在不测试任何代码的情况下返回对象或响应以调用松弛提供程序、获取 HTTP 响应并反序列化相同内容,那么我们使用 Mockito 模拟基于 HTTP 的整个过程。使用 Wiremock 将允许我们进行尽可能真实的运行时测试,因为它模拟了 REST 名称的调用和响应的反序列化。
WireMock 和 Mockito 之间的区别
WIREMOCK |
MOCKITO |
---|---|
Web 服务器充当真实 API |
没有 Web 服务器 |
真实的 HTTP 调用 |
没有可用的 HTTP 调用 |
应用程序代码的外部 |
应用程序代码的一部分 |
可以模拟网络调用 |
无法模拟网络调用 |
它不特定于语言。这意味着,如果您正在处理基于 Rest 的响应,无论您使用的是 Java、Python 还是 Groovy,都可以简单地使用 Wiremock。 |
但是,Mockito 是一个模拟库,专门针对某种语言。例如,在 Java 编程中,模拟库称为 Mockito,而在其他编程语言中,它则被称为不同的名称。 |
结论
Wiremock 和 mockito 在许多方面都彼此不同。Wiremock 可以模拟网络调用,而 mockito 则不能模拟网络调用。Mockito 也是一个专门针对某种语言的模拟库,但 Wiremock 在语言方面并不具体。