浅显易懂实战Mock工具WireMock

官网,开源(GitHub, 7.4K Star,1.5K Fork)、Java实现、HTTP模拟(Mock)服务,为特定请求提供固定的返回值。官方文档,WireMock Cloud。

可作为单独进程启动,模拟一个WEB服务器,提供一些API访问,并返回特定的返回值。也可作为第三方库在项目中使用。

实战

standalone

打开Maven仓库,找到最新Release版或Beta版下载,如wiremock-standalone-3.13.2.jar,终端执行命令启动HTTP服务器:java -jar wiremock-standalone-3.13.2.jar -port 9998,启动界面

打开浏览器

可见这个wiremock-standalone-3.13.2.jar Fat Jar里内嵌有Jetty服务器。解压缩该Jar文件,也能看到Jetty相关代码包。

另外在Jar文件所在目录下,会自动生成2个文件夹:

  • __files:用于存放返回数据文件
  • mappings:用于存放映射关系

打开http://localhost:9998/__admin/或更进一步http://localhost:9998/__admin/mappings,查看所有映射(mapping),此时因为没有任何有效JSON文件,请求返回为空:

往mappings目录下添加JSON文件,添加子目录和子目录下的JSON文件:

刷新浏览器,http://localhost:9998/__admin/页面会看到类似如下输出:

对比可知两个URL请求的输出完全一致。分析JSON响应,可知WireMock会自动扫描嵌套子文件夹。

注意:增加、或删除JSON文件,修改JSON内容,都需要重启WireMock服务:杀掉进程,重新执行命令行。

启动命令行时也能指定根目录:java -jar wiremock-standalone-3.13.2.jar -port 9998 --root-dir test,WireMock检测该test目录下是否存在上述两个文件夹,有则加载,无则生成。

JSON文件示例:

json 复制代码
{
	"request": {
		"method": "GET",
		"urlPath": "/test"
	},
	"response": {
		"status": 200,
		"body": "Hello World!",
		"headers": {
			"Content-Type": "application/json"
		}
	}
}

Bruno或cURL发起GET请求http://localhost:9998/test,会看到经典的Hello World!输出。

再来看看__files文件夹,添加users-response.json文件,修改映射文件:

json 复制代码
{
	"request": {
		"method": "GET",
		"urlPath": "/test"
	},
	"response": {
		"status": 200,
		"bodyFileName": "users-response.json",
		"headers": {
			"Content-Type": "application/json"
		}
	}
}

注意:一定要删除body字段,body和bodyFileName字段共存时,WireMock只认body字段,优先解析body字段。

默认情况下,WireMock对于URL是大小写敏感的。修改为大写开头,即测试http://localhost:9998/Test,报错404

修改映射文件:

json 复制代码

如果写错JSON文件,会出现类似如下报错:

复制代码
Exception in thread "main" com.github.tomakehurst.wiremock.standalone.MappingFileException: Error loading file /Users/tssh/Downloads/wiremock/./mappings/permission-mapping/demo1.json:
Unrecognized field "caseInsensitive" (class com.github.tomakehurst.wiremock.matching.RequestPattern), not marked as ignorable
	at com.github.tomakehurst.wiremock.standalone.JsonFileMappingsSource.loadMappingsInto(JsonFileMappingsSource.java:126)
	at com.github.tomakehurst.wiremock.core.WireMockApp.loadMappingsUsing(WireMockApp.java:288)
	at com.github.tomakehurst.wiremock.core.WireMockApp.loadDefaultMappings(WireMockApp.java:282)
	at com.github.tomakehurst.wiremock.core.WireMockApp.<init>(WireMockApp.java:143)
	at com.github.tomakehurst.wiremock.WireMockServer.<init>(WireMockServer.java:68)
	at com.github.tomakehurst.wiremock.standalone.WireMockServerRunner.run(WireMockServerRunner.java:71)
	at wiremock.Run.main(Run.java:23)
json 复制代码
json 复制代码
json 复制代码

插件

官方提供IDEA插件,直接在IDEA里搜索WireMock安装,或打开地址下载安装。安装成功后,打开JSON文件,会出现2个按钮。

左侧按钮是启动服务器

点击相当于执行上面的java -jar命令:

右侧按钮是使用模板,

点击后,需安装Handlebars/Mustache插件

拓展:Handlebars是一款JavaScript生态下的模板引擎,兼容Mustache,可将模板编译成JavaScript函数。

Maven

Maven项目添加如下依赖:

xml 复制代码
<dependency>
	<groupId>org.wiremock</groupId>
	<artifactId>wiremock</artifactId>
	<version>3.13.2</version>
	<scope>test</scope>
</dependency>

Gradle

Gradle项目添加如下依赖

groovy 复制代码
testImplementation "org.wiremock:wiremock:3.13.2"

Docker

基于Docker快速部署:

bash 复制代码
docker run -it --rm -p 8080:8080 --name wiremock wiremock/wiremock:3.13.2

WireMock Cloud