Wiremock 与Mockito的区别

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系统可能不总是可用,这意味着我们完全依赖系统中的任何停机时间
  • 有时,它并不包含测试环境

Wiremock 与Mockito的区别

图-1

方法2

第二种方法是使用一个模拟服务器来模拟对依赖项的请求的响应。

Wiremock 与Mockito的区别

图-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在语言方面并不特定。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程