Java单元测试模拟网络请求的关键是精准控制依赖行为、隔离真实网络、验证逻辑分支与异常路径,通过抽象HTTP客户端为接口、Mock响应、嵌入式服务或检查请求构造来实现快稳可重复的测试。

Java 单元测试模拟复杂网络请求,关键不是“发出去”,而是**精准控制依赖行为、隔离真实网络、验证逻辑分支与异常路径**。重点在于解耦 HTTP 客户端代码,用 Mock 或轻量级内存服务替代真实调用,让测试快、稳、可重复。
拆分客户端逻辑,抽象网络层
把发起请求的核心能力(如 HttpClient 调用)抽成接口,例如:
- 定义接口:`HttpClientAdapter.execute(HttpPost request)` 或 `WebServiceClient.call(String endpoint, Object payload)`
- 被测类只依赖该接口,不直接 new HttpClient 或 RestTemplate
- 测试时注入 Mock 实现,完全绕过网络栈
用 Mockito 模拟具体请求行为
适用于需要校验请求参数、返回状态码、响应体或异常场景的测试:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- Mock `CloseableHttpResponse`,预设 `getStatusLine().getStatusCode()` 返回 401、500 等
- Mock `InputStream`,让 `response.getEntity().getContent()` 返回自定义 JSON 字节数组
- 用 `doThrow(new IOException())` 模拟连接超时或 socket 关闭
- 用 `verify(httpClient).execute(argThat(post -> post.getURI().toString().contains("/v2/order")))` 校验是否发到了正确地址
用嵌入式服务模拟真实交互流
当需验证握手细节、长连接、重连机制或 WebSocket/HTTP/2 等协议行为时,启动内存服务器更可靠:
立即学习“Java免费学习笔记(深入)”;
- WebSocket:用 Java-WebSocket 的 `WebSocketServer` 启动本地实例,配合 `SocketUtil.getAvailablePort()` 动态选端口
- HTTP:用 WireMock(推荐)、OkHttp 的 `MockWebServer` 或 Spring Boot 的 `@AutoConfigureWireMock`
- 服务端可编程控制响应延迟、返回特定头字段、主动断连、复用连接等,覆盖超时、重定向、429 限流等真实场景
验证请求构造本身(不发出去)
有些逻辑发生在“发送前”,比如签名、Token 注入、Header 设置、Body 序列化,这类无需网络也能测:
- 通过反射获取客户端内部 `HttpPost` 或 `HttpRequest` 对象
- 检查 `getFirstHeader("Authorization")` 是否非空且格式正确
- 断言 `getEntity().getContent()` 可读出预期 JSON 字符串(而非只看是否为 null)
- 对自定义 `HttpEntity` 子类,直接 new 实例并调用 `writeTo()` 验证序列化结果

















