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