WireMock for Java:HTTP 模拟服务器完整指南
\n\n1. 什么是 WireMock 及其用途
\nWireMock 是一个强大的 Java 库(也可通过独立服务器用于其他语言),用于创建 HTTP 模拟服务器进行测试。本质上,它是一个真实 HTTP 服务(API、REST、SOAP)的模拟器,您可以配置它,使其对特定请求返回预定义的响应。对于从事微服务架构或依赖外部 HTTP 服务的系统开发人员和测试人员来说,这是一个不可或缺的工具。
\n为什么需要它?在现代开发中,应用程序很少独立存在。它们与数据库、支付网关、授权服务、天气 API 以及数十个其他外部系统进行通信。对这些集成进行“实时”测试令人头疼:外部服务可能不可用、响应缓慢、返回意外数据,甚至更糟的是,每次请求都会向您收费。WireMock 解决了这个问题,它允许您:
\n- \n
- 隔离测试: 您只测试自己的代码,不依赖外部服务的可用性和稳定性。 \n
- 模拟罕见场景: 轻松让模拟服务器返回 500 错误、超时、空响应或特定标头——这些在真实服务中很难重现。 \n
- 加速测试: 模拟服务器在毫秒内响应,而真实服务可能需要几秒钟。 \n
- 并行开发: 当后端团队尚未实现 API 时,前端团队已经可以使用 WireMock 编写和测试代码。 \n
WireMock 作为一个完整的 HTTP 服务器(基于 Jetty)运行,可以在测试内部或作为独立进程启动。它拦截 HTTP 请求,将其与配置的规则(stubs)进行比较,并返回相应的响应。该库支持记录和回放(record/playback)、状态验证(verify)、模板处理(Handlebars)、延迟模拟等功能。
\n2. 安装
\nWireMock for Java 通过 Maven Central 分发。将以下依赖项添加到您的 pom.xml(适用于 Maven)或 build.gradle(适用于 Gradle)。
Maven (pom.xml):
\n<dependency>\n <groupId>org.wiremock</groupId>\n <artifactId>wiremock</artifactId>\n <version>3.9.1</version> <!-- 请查看 Maven Central 上的最新版本 -->\n <scope>test</scope>\n</dependency>\n Gradle (build.gradle):
\ntestImplementation 'org.wiremock:wiremock:3.9.1'\n 重要提示: 从 3.x 版本开始,WireMock 需要 Java 11 或更高版本。如果您使用 Java 8,则需要使用 2.x 版本(例如 2.35.1),但强烈建议升级到 Java 11+。
3. 快速入门——最小工作示例
\n让我们创建一个最简单的测试,启动 WireMock,为 /api/hello 的 GET 请求配置一个桩,并验证客户端是否收到预期的响应。
import com.github.tomakehurst.wiremock.WireMockServer;\nimport com.github.tomakehurst.wiremock.client.WireMock;\nimport static com.github.tomakehurst.wiremock.client.WireMock.*;\nimport static org.junit.jupiter.api.Assertions.assertEquals;\nimport org.junit.jupiter.api.Test;\nimport java.net.URI;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpReq