如何让Wiremock将特定调用记录写入文件以用于测试验证
实现方案
方案一:使用内置日志重定向(无需编码,最快实现)
WireMock自带的verbose日志会输出所有收到的请求信息,你直接启动时重定向输出到指定文件即可:
- 基础启动命令:
java -jar wiremock-jre8-standalone-2.35.0.jar --port 8080 --verbose > all_request_logs.txt - 如果你只需要纯URL字段,不需要其他冗余日志,可以通过管道过滤后写入:
java -jar wiremock-jre8-standalone-2.35.0.jar --port 8080 --verbose | grep "Request:" | awk '{print $3}' > only_urls.txt
方案二:自定义RequestListener扩展(支持自定义写入逻辑)
如果需要自定义输出格式、写入规则,你可以通过WireMock的扩展能力实现:
- 引入WireMock依赖,编写自定义请求监听器,示例代码如下:
import com.github.tomakehurst.wiremock.common.FileSource; import com.github.tomakehurst.wiremock.extension.Parameters; import com.github.tomakehurst.wiremock.extension.RequestListener; import com.github.tomakehurst.wiremock.http.Request; import com.github.tomakehurst.wiremock.http.Response; import java.io.FileWriter; import java.io.IOException; public class UrlWritingRequestListener implements RequestListener { private final String targetFilePath; public UrlWritingRequestListener(String targetFilePath) { this.targetFilePath = targetFilePath; } @Override public void requestReceived(Request request, Response response, FileSource files, Parameters parameters) { // 可自行调整输出内容,比如追加请求时间、请求方法、请求体等 String logLine = String.format("[%s] %s%n", request.getMethod(), request.getAbsoluteUrl()); try (FileWriter writer = new FileWriter(targetFilePath, true)) { writer.write(logLine); } catch (IOException e) { // 可按需求调整异常处理逻辑 e.printStackTrace(); } } @Override public String getName() { return "url-writing-listener"; } }
- 将编写好的类打包为jar包,放到WireMock的运行classpath中
- 启动WireMock时指定加载该扩展即可:
java -cp "wiremock-jre8-standalone-2.35.0.jar:your-custom-extension.jar" com.github.tomakehurst.wiremock.standalone.WireMockServerRunner --extensions com.yourpackage.UrlWritingRequestListener --port 8080
- 如果你是在JUnit等测试框架中直接集成WireMock,不需要单独打jar包,初始化WireMockServer时直接注册该监听器实例即可。
补充可选方案
如果你不需要持久化到文件,只是要在测试逻辑中做断言,可以直接在测试运行结束后调用WireMock的内置Admin接口/__admin/requests,直接获取所有历史请求记录做校验,更适合自动化测试场景。
内容的提问来源于stack exchange,提问作者Rob Bonner
相关产品推荐
相关产品推荐

