
本文介绍如何在非测试场景(如 Spring Boot 应用启动时)启用 WireMock 的响应模板(Response Templating)功能,通过手动初始化 WireMockServer 并注册 ResponseTemplateTransformer 扩展实现。
本文介绍如何在非测试场景(如 spring boot 应用启动时)启用 wiremock 的响应模板(response templating)功能,通过手动初始化 `wiremockserver` 并注册 `responsetemplatetransformer` 扩展实现。
在 Spring Boot 项目中,若希望将 WireMock 作为嵌入式 HTTP 模拟服务长期运行(例如用于本地开发联调、契约测试或 Mock Server 网关),而非仅限于 JUnit 单元测试,就不能依赖 @Rule + WireMockRule 这种测试专用生命周期管理方式——因为 @Rule 是 JUnit 4 的测试钩子,无法在应用上下文启动阶段生效。
此时,应改用 WireMockServer 手动构建方式,并通过 WireMockConfiguration 显式注入所需扩展。核心要点是:必须在创建 WireMockServer 实例时,通过 .extensions(...) 方法传入 ResponseTemplateTransformer,且需确保其构造参数为 false(禁用安全模式,否则模板语法将被限制)。
以下是在 Spring Boot 应用中初始化支持模板的 WireMock 服务的推荐做法:
@Configuration
public class WireMockConfig {
private static final int WIREMOCK_PORT = 8089;
@Bean(destroyMethod = "stop")
@ConditionalOnMissingBean
public WireMockServer wireMockServer() {
WireMockServer server = new WireMockServer(
new WireMockConfiguration()
.port(WIREMOCK_PORT)
.extensions(new ResponseTemplateTransformer(false)) // ✅ 关键:启用模板且关闭安全限制
);
server.start();
return server;
}
}
⚠️ 注意事项:
- ResponseTemplateTransformer(false) 中的 false 表示禁用安全模式(secure mode),允许使用完整 Velocity 语法(如 #if, #set, $request 等)。生产环境请谨慎评估风险,必要时可结合白名单机制加固。
- @Bean(destroyMethod = "stop") 确保 Spring 容器关闭时自动调用 server.stop(),避免端口泄漏。
- 若需加载 JSON Stub 文件并启用模板,确保 .json 文件中 response 节点包含 "transformers": ["response-template"],例如:
{ "request": { "method": "GET", "url": "/api/user" }, "response": { "status": 200, "body": "{ \"id\": {{randomValue 'integer'}}, \"name\": \"{{jsonPath request.body '$.name'}}\" }", "headers": { "Content-Type": "application/json" }, "transformers": ["response-template"] } }
综上,脱离 JUnit 环境后,WireMock 的扩展能力依然完整可用——关键在于绕过 @Rule,转而通过 WireMockServer + WireMockConfiguration 主动配置。这种方式更灵活,也更适合集成进 Spring Boot 生命周期,是构建可靠本地 Mock 服务的基础实践。











