介绍

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

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

  1. java文件怎么建立关联_如何创建两个Java Web应用程序并相互关联jar依赖关系和其他文件?...

    当前,我们有一个用于Web服务的Web应用程序(名为ws-project).它使用另外两个项目: > dao项目(休眠) >核心项目(pojo) ws-project (war) | +- ...

  2. 使用Hibernate和Spring构建Java Web应用程序

    这篇文章将展示如何在Spring环境中使用带有Hibernate ORM的MYSQL DB创建学生注册应用程序. 这是一个简单的应用程序,旨在在注册过程中从用户收集输入详细信息,将这些详细信息保存在M ...

  3. 使用MyBatis和Spring构建Java Web应用程序

    这篇文章将展示如何在Spring环境中使用带有MyBatis框架的MYSQL DB创建学生注册应用程序. 这是一个简单的应用程序,旨在在注册期间从用户收集输入详细信息,将详细信息保存在MYSQL DB ...

  4. web csrf java_在Java Web应用程序中阻止CSRF

    web csrf java 跨站点请求伪造攻击(CSRF)在Web应用程序中非常常见,如果允许,可能会造成重大危害. 如果您从未听说过CSRF,建议您查看有关它的OWASP页面 . 幸运的是,阻止CS ...

  5. 在Java Web应用程序中阻止CSRF

    跨站点请求伪造攻击(CSRF)在Web应用程序中非常常见,如果允许,可能会造成重大危害. 如果您从未听说过CSRF,建议您查看有关它的OWASP页面 . 幸运的是,阻止CSRF攻击非常简单,我将向您展 ...

  6. 操作方法:具有多个Mongo存储库和Kotlin的Spring Boot 2 Web应用程序

    首先,免责声明:如果您正在编写微服务 (每个人现在都对吗?)并希望它是惯用的 ,那么通常不会在其中使用几个不同的数据源. 图片取自Pixabay© https: //pixabay.com/illus ...

  7. 百家与g对比oogle_如何在Java Web应用程序中集成G​​oogle reCAPTCHA

    百家与g对比oogle I never liked Captchas because the burden was always on end user to understand the lette ...

  8. java web里实现 mvc_MVC模式在Java Web应用程序中的实现

    一.MVC简介: MVC架构是一个复杂的架构,其实现也显得非常复杂..Views可以看作一棵树,可以用Composite Pattern来实现.Views和Models之间的关系可以Observer  ...

  9. MVC模式 在Java Web应用程序中的实现

    一.MVC简介 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分 ...

最新文章

  1. 网上复制代码需谨慎,莫名其妙报错看这里!
  2. mysql 对象名无效_如何解决“SQL对象名无效”的问题
  3. centos7设置成文件服务器,CentOS7服务器架设ftp过程
  4. 数据可视化----我在寻找一款类似vfp或是access这样自带可视化风格的数据库或是键盘数据库...
  5. cocos2dx基础篇(2)——Win32移植到Android
  6. 线程同步 互斥量(mutex) Linux函数
  7. 本地chrome调试服务器node
  8. Atitit React的相关概念东东 attilax总结 v3
  9. 《深度学习的艺术》笔记整理读后感
  10. jsp text 水印_java实现图片上加文字水印(SpringMVC + Jsp)
  11. 树结构——2-3树图解
  12. 如何将资源打包成.unity3d文件
  13. 科技周刊第五期:科学技术在发展中的作用
  14. 副驾驶的意义_副驾驶对女人的意义是什么样的?
  15. scrapy爬取猫眼电影及详情页
  16. pythonrequest爬取小说_python爬取斗破苍穹小说
  17. excel2007快捷键
  18. Echarts模拟迁徙之飞机变小车
  19. 阿里云服务器挂载云盘
  20. 趣谈网络协议——P2P协议

热门文章

  1. 跟我学 Java 8 新特性之 Stream 流基础体验
  2. JVM 调优和垃圾回收器说明
  3. JVM运行时区域详解
  4. java导出javadoc文档
  5. mybatis简单案例源码详细【注释全面】——Dao层接口(UserMapper.java)
  6. 二维数组常用的赋值方式
  7. 263. 丑数---LeetCode---JAVA
  8. 公共计算机课程思政建设实施方案,公共计算机教研组开设课程思政公开课
  9. java oca_OCA的Java拼图游戏第3部分
  10. 只读事务上下文_我可以/应该在事务上下文中使用并行流吗?