Java Stream 排序与 Comparator 的空指针处理,以及 IDEA 调试里 null 不显示的坑
记录一次排序 NPE 的排查和解决,顺便说下 IDEA 调试集合时 null 元素不显示的问题怎么调整。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-07-09 13:15:45 WireMock 请求头匹配 响应配置 Java Mock
最近在搞集成测试,拿 WireMock 去挡下游接口,需要校验请求头里带的 Authorization、Accept 这些字段,再按条件返回不同的响应。直接把配置过程记一下,后面再看也方便。
WireMock 支持两种方式来配置 stub:一种是写 JSON 映射文件扔到 mappings 目录下,另一种是在代码里用它的 Java API 直接注册。两种我都用了,场景不一样而已。下面分开说。
先说 JSON 映射文件。比如我想匹配 GET 请求,路径是 /api/example,同时要求请求头里 Authorization 必须是 Bearer your_access_token,Accept 必须为 application/json,匹配上之后返回 200 和一个 JSON 字符串。JSON 可以写成这样:
{
"request": {
"method": "GET",
"url": "/api/example",
"headers": {
"Authorization": {
"equalTo": "Bearer your_access_token"
},
"Accept": {
"equalTo": "application/json"
}
}
},
"response": {
"status": 200,
"body": "Hello, this is a mocked response!",
"headers": {
"Content-Type": "application/json"
}
}
}
request 那块定义了匹配规则,method 和 url 都好理解,headers 里面用 equalTo 来做精确匹配。如果实际请求的 Authorization 或 Accept 不符合,这个 stub 就不会命中,请求会被 WireMock 默认的 404 处理。
response 部分除了 body,也可以设 headers,比如把 Content-Type 设成 application/json。写完这个 JSON 文件放到 mappings 目录,重启 WireMock 服务就生效了。
如果你用的是 WireMock 的 standalone jar,直接放在指定目录就行;内嵌到测试里的话,可以用代码方式加载映射文件,不过我更习惯直接在 Java 里注册 stub,省得维护一堆 JSON 文件。
Java API 的写法也很直观。先用 WireMockServer 起一个内嵌实例,端口可以自己指定,比如 8080。然后调 WireMock.stubFor 注册规则。上面同样的逻辑,用代码写就是:
WireMockServer wireMockServer = new WireMockServer(WireMockConfiguration.options().port(8080));
wireMockServer.start();
WireMock.stubFor(WireMock.get(WireMock.urlPathEqualTo("/api/example"))
.withHeader("Authorization", WireMock.equalTo("Bearer your_access_token"))
.withHeader("Accept", WireMock.equalTo("application/json"))
.willReturn(WireMock.aResponse()
.withStatus(200)
.withBody("{\"message\": \"Hello, World!\"}")));
// 最后别忘了停掉
wireMockServer.stop();
withHeader 方法可以重复调用,多个头挨个配就行。匹配规则也不止 equalTo 一种,像 contains、matches 之类在复杂场景很有用,不过这里先不说。
willReturn 里除了状态码和 body,后面要自定义响应头也方便,链式调用 withHeader 就行。
响应头配置这部分,其实在上面两个例子里已经带出来了。JSON 映射文件里就在 response 对象的 headers 下加字段,比如额外加一个 X-Custom-Header:
"headers": {
"Content-Type": "application/json",
"X-Custom-Header": "CustomValue"
}
Java 代码里也是这样:
.withHeader("Content-Type", "application/json")
.withHeader("X-Custom-Header", "CustomValue")
这套下来,基本能覆盖大部分需要按请求头分发 mock 响应的场景。线上实际跑起来,配合 CI 里的集成测试,至少把对真实下游的依赖摘干净了,定位问题也快不少。
至于更高级的玩法,比如自定义匹配器、多值 header 的处理,等遇到具体坑再补充吧。
上一篇: 证书200天时代:别等中断了再补票,ACME自动化才是保命绳
下一篇: Windows下用批处理查看与管理凭据
记录一次排序 NPE 的排查和解决,顺便说下 IDEA 调试集合时 null 元素不显示的问题怎么调整。
记录 datetime 字段定义、插入、格式化查询以及 Java 端类型映射、时区等问题,避免线上踩坑。
拥抱Java 8及更高版本带来的日期处理革新!本文聚焦于yyyy-MM-dd格式化,详细对比传统SimpleDateFormat与现代DateTimeFormatter。深入探讨DateTimeFormatter为何成为未来主流,其不可变性、线程安全等核心优势如何助你构建更健壮、高效的应用。是时候升级你的日期格式化方式了!
深入探讨Java中树形结构与平铺列表(List)互转的艺术。文章详尽剖析了递归与非递归两种实现方法,包括从树到平铺的两种策略,以及将扁平数据重构为树的技巧。无论追求代码简洁还是规避栈溢出风险,这里都有你的最佳实践。