将Wiremock集成到Spring Boot Java Web应用程序中以模拟外部依赖关系

介绍

WireMock是用于基于HTTP的API的模拟服务器。 有些人可能会将其视为服务虚拟化工具或模拟服务器。 它使您能够存根所需的API或其他外部依赖项,以加快本地开发速度。 它支持测试真实API无法可靠产生的极端情况和失败模式。 在模拟单元测试和集成测试中的外部依赖关系时,它也很有用。 它与jUnit具有出色的集成。

添加Wiremock依赖性

首先,您将要添加Wiremock依赖项。 您可以下载常规依赖项或包含所有依赖项的胖JAR独立版本。 我们将在此处使用标准依赖项。 将以下依赖项添加到您的build.gradle中

build.gradle

dependencies {testCompile('com.github.tomakehurst:wiremock:2.1.12')
}

添加Wiremock单元测试

这是完整的单元测试,可用于测试与Wiremock的集成。 该单元测试使用jUnit4规则启动端口8089上的Wiremock服务器,并在每次测试后将其关闭。 我们使用stubFor方法来定义模拟的终点和响应。 我们使用Spring RestTemplate创建一个到模拟服务器的HTTP请求并捕获结果。

WiremockTests.java

public class WiremockTests {RestTemplate restTemplate;ResponseEntity response;@Rulepublic WireMockRule wireMockRule = new WireMockRule(wireMockConfig().port(8089).httpsPort(8443));@Beforepublic void setup() throws Exception {restTemplate = new RestTemplate();response = null;}@Testpublic void givenWireMockAdminEndpoint_whenGetWithoutParams_thenVerifyRequest() {RestTemplate restTemplate = new RestTemplate();response = restTemplate.getForEntity("http://localhost:8089/__admin", String.class);assertThat("Verify Response Body", response.getBody().contains("mappings"));assertThat("Verify Status Code", response.getStatusCode().equals(HttpStatus.OK));}@Testpublic void givenWireMockEndpoint_whenGetWithoutParams_thenVerifyRequest() {stubFor(get(urlEqualTo("/api/resource/")).willReturn(aResponse().withStatus(HttpStatus.OK.value()).withHeader("Content-Type", TEXT_PLAIN_VALUE).withBody("test")));response = restTemplate.getForEntity("http://localhost:8089/api/resource/", String.class);assertThat("Verify Response Body", response.getBody().contains("test"));assertThat("Verify Status Code", response.getStatusCode().equals(HttpStatus.OK));verify(getRequestedFor(urlMatching("/api/resource/.*")));}
}

您可以运行此测试,如果完成,则您已成功将Wiremock集成到应用程序中。

深入到单元测试

这是一些静态导入,您可以在测试中使用这些静态导入来提高可读性和简洁性。

WiremockTests.java

import static com.github.tomakehurst.wiremock.client.WireMock.*;
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.springframework.http.MediaType.TEXT_PLAIN_VALUE;

jUnit4规则

这个jUnit4 @rule将自动管理Wiremock服务器的生命周期以及每个测试用例的启动和关闭Wiremock。 您也可以使用setup()teardown()方法来实现,但是jUnit4规则更加简洁明了。

WiremockTests.java

@Rulepublic WireMockRule wireMockRule = new WireMockRule(wireMockConfig().port(8089).httpsPort(8443));

残端和响应

此代码使用stubFor()方法已静态导入)定义端点, / api / resource /和纯文本响应主体“ test”。您也可以使用此方法通过更改Content-返回JSON或XML响应。类型和响应主体

WiremockTests.java

stubFor(get(urlEqualTo("/api/resource/")).willReturn(aResponse().withStatus(HttpStatus.OK.value()).withHeader("Content-Type", TEXT_PLAIN_VALUE).withBody("test")));

春天RestTemplate

我们使用Spring RestTemplate类对http:// localhost:8089 / api / resource /执行GET HTTP请求,以打到Wiremock服务器的存根端点。 在这种情况下,我们期望一个String.class实体响应,因为那是我们在stubFor()方法中定义的。 如果您配置了POJO对象,则需要定义一个POJO对象以从存根方法捕获JSON响应。 我们在ResponseEntity对象中捕获响应,该对象捕获响应主体,标头和状态代码以及有关请求的其他信息。

WiremockTests.java

response = restTemplate.getForEntity("http://localhost:8089/api/resource/", String.class);

手动启动和停止Wiremock服务器

您可以手动启动和停止Wiremock服务器,而无需使用jUnit4规则来管理生命周期。 当您的应用程序启动时,您可能希望这样做是一种引导方法。

ServiceClass.java

WireMockServer wireMockServer = new WireMockServer(wireMockConfig().port(8089)); //No-args constructor will start on port 8080, no HTTPS
wireMockServer.start();WireMock.reset();wireMockServer.stop();

结论

现在,您的项目中已安装Wiremock。 您可以在单元测试和集成测试中使用Wiremock来对外部依赖关系进行存根,也可以加快本地环境中的开发。 您可以在此处阅读有关设置Wiremock的更多信息: http ://wiremock.org/docs/getting-started/

翻译自: https://www.javacodegeeks.com/2016/09/integrate-wiremock-spring-boot-java-web-application-mocking-external-dependencies.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351668.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows下node安装

1.首先到node官网进行下载 下载页面中windows版本分两种,这里我们选择.msi进行安装(.zip是免安装的,但需要单独配置环境变量使用) 2.安装过程如下所示 这里可以更改安装的路径 这里默认会将node和npm加到环境变量中 3.验证安装 安…

tab键的转义字符_Python转义字符及用法

在《Python字符串》一节中我们曾提到过转义字符,就是那些以反斜杠\开头的字符。ASCII 编码为每个字符都分配了唯一的编号,称为编码值。在 Python 中,一个 ASCII 字符除了可以用它的实体(也就是真正的字符)表示,还可以用它的编码值表示。这种使用编码值来间接地表示字符的方…

CentOS中通过NAT连接网络

讲正文之前,推荐一个连接:http://wuxinaiaman928.blog.163.com/blog/static/64932144200811911233198/ 里面比较详细的介绍了Vmware中三种不同的连接方式:桥连接,NAT,使用主机网络,有助于理解简单来讲&…

serialport通过usb通讯_IOT串口通讯-RS232/RS485

串口串口是串行接口(serial port)的简称,也称为串行通信接口或COM接口。串口通信是指采用串行通信协议(serial communication)在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式。串口按电气标准及协议来划分,包括RS-232-C、RS-422、RS485等…

【项目管理和构建】——Maven下载、安装和配置(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[] 前言 在上篇博文【项目管理和构建】——Maven简介(一)中我们了解到maven是一种全新的项目构建方式,让我们的开发更加简单,高效。Maven主要做的是两件事…

mapreduce 算法_MapReduce算法–顺序反转

mapreduce 算法这篇文章是介绍MapReduce算法的系列文章的另一部分,该书在使用MapReduce进行数据密集型文本处理中找到。 先前的文章是Local Aggregation , Local Aggregation PartII和创建共现矩阵 。 这次我们将讨论阶数反转模式。 顺序反转模式利用的M…

lamp mysql开启命令_mysql lamp 配置命令总结

[email protected] ~]# chown -R mysql:mysql /usr/local/mysql (注:更改MySQL安装目录属主,属组)[[email protected] mysql-5.5.22]# cp support-files/my-medium.cnf /etc/my.cnf (注:复制MySQL配置文件)[[email protected] mysql-5.5.22]#…

算法复杂度分析(下):最好、最坏、平均、均摊等时间复杂度概述

细化时间复杂度分析 代码千千万,有些代码逻辑会很复杂,所以为了更细化的分析算法的复杂度,再复杂度分析方面引入了4个知识点: 1.最好情况时间复杂度(best case time complexity)。 2.最坏情况时间复杂度&am…

梦想成真…教学–专业的Java开发人员:工具和最佳实践

我总是喜欢分享知识。 我写博客的原因之一是分享我在软件工程师方面的知识。 创立并运行(与几个朋友一起)第一个 早在2003年, 希腊的Java用户组就是由于我们在工作中得不到足够的培训或个人开发机会,因此我们希望共享和重用我们作…

arachni web mysql数据库_Web安全扫描工具Arachni

Arachni是一个多功能、模块化、高性能的Ruby框架,旨在帮助渗透测试人员和管理员评估web应用程序的安全性。同时Arachni开源免费,可安装在windows、linux以及mac系统上,并且可导出评估报告。一、Arachni下载与启动,以LInux环境为例…

tomcat - 报错 No such device; No faulty members identified.

启动tomcat集群的时候出现以下报错,导致集群没办法启动: java.net.SocketException: No such device; No faulty members identified. SEVERE: Unable to start cluster. org.apache.catalina.tribes.ChannelException: java.net.SocketException: No su…

设计模式09----门面设计模式

转自:https://www.cnblogs.com/lthIU/p/5860607.html 针对外观模式,在项目开发和实际运用中十分频繁,但是其极易理解,下面就简要介绍一下。 一、概念介绍 外观模式(Facade),他隐藏了系统的复杂性&#xff0…

mysql 匿名块_MySQL存储过程定义中的特性(characteristic)的含义

MySQL的存储过程蛮啰嗦的,与MSSQL或者Oracle的存储过程相比,如果没有显式指定,他会隐含地指定一系列特性(characteristic)的默认值来创建存储过程通常在使用图形界面工具进行存储过程编写的时候,图形界面工具会自动加上这部分内容…

Tomcat集群和Session共享的配置方法

Tomcat集群配置其实很简单,在Tomcat自带的文档中有详细的说明( /docs/cluster-howto.html ),只不过是英语的,对我这样的人来说很难懂 。 下面根据说下怎么配置吧: 第一步、准备工作: 准备几份Tomcat程序&#xff0c…

Python:GUI Tkinter

GUI编程 GUI编程(Graphical User Interface Programming)指的是用于创建图形用户界面的程序设计。这种界面采用图形方式显示信息,让用户可以通过图形化的方式与程序进行交互,而不是仅仅通过文本命令。GUI编程使得软件更加直观易用…

jenkins配置工程目录-启动case

1.我们在python里面编辑的脚本可以正常跑,但是在cmd里面跑就不行了,找不到自己定义的方法模块,这个时候我们要搞个环境变量 name : PYTHONPATH val : 工程目录路劲如: D:python\test 这个时候我们再次cmd运行发现可以运行了…

mrunit_使用MRUnit测试Hadoop程序

mrunit这篇文章将略微绕开使用MapReduce实现数据密集型处理中发现的模式,以讨论同样重要的测试。 汤姆•惠勒 ( Tom Wheeler)在纽约2012年Strata / Hadoop World会议上参加的一次演讲给了我部分启发。 当处理大型数据集时,想到的并…

mysql innodb flush method_对innodb_flush_method的一点解释

官方文档描述如下:By default, InnoDB uses the fsync()system call to flush both the data and log files. Ifinnodb_flush_method option is set to O_DSYNC, InnoDB uses O_SYNC to open and flush thelog files, and fsync()to flush the data files. If O_DIR…

信号量、互斥体和自旋锁

一、信号量 信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信。本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。一般说来&…

alembic教程

安装pip install alembic步骤 1.初始化 alembic 仓库 在终端中, cd 到你的项目目录中,然后执行命令 alembic init alembic ,创建一个名叫 alembic 的仓库。2.创建模型 class User(Base):__tablename__ userid Column(Integer,primary_keyTr…