Spring Boot集成测试中WireMock不显示Stub不匹配的请求差异
Spring Boot集成测试中WireMock未匹配Stub时不展示请求差异的解决方法
问题描述
在Spring Boot集成测试场景下,WireMock在Stub未匹配时仅抛出404错误,日志仅输出:
Request was not matched =======================
后续仅显示截断的日志内容--------------------------------------------------------... (20142 bytes)]以及异常信息[404 Not Found] during [PUT],无法查看预期JSON与实际JSON的对比细节。
已尝试以下三种开启详细日志的方式,但均无效:
- 在log4j2.xml中配置日志级别
- 在
application-test.properties中设置logging.level.com.github.tomakehurst.wiremock=DEBUG - 在
@BeforeEach方法中调用RestAssuredMockMvc.enableLoggingOfRequestAndResponseIfValidationFails(LogDetail.ALL);
解决方法
1. 调整WireMock日志级别与输出配置
WireMock的请求匹配差异日志默认在WARN级别输出,需确保日志框架未过滤该级别日志:
- 若使用log4j2.xml,添加或修改如下配置:
<Logger name="com.github.tomakehurst.wiremock" level="WARN" additivity="false"> <AppenderRef ref="Console"/> </Logger> - 同时关闭日志截断,避免大内容被省略,在log4j2.xml的Console Appender中调整PatternLayout:
或在<Appender name="Console" type="Console"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg{100000}%n"/> </Appender>application-test.properties中添加:logging.pattern.console=%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg{100000}%n
2. 启用WireMock控制台详细通知
在WireMock初始化时配置控制台通知器,强制输出匹配失败的详细差异:
@Bean public WireMockConfiguration wireMockConfiguration() { return WireMockConfiguration.options() .notifier(new ConsoleNotifier(true)); }
若为手动初始化WireMock实例,可添加:
WireMock.configureFor("localhost", 8080); WireMock.setGlobalSettings(new GlobalSettings().setNotifier(new ConsoleNotifier(true)));
3. 主动获取未匹配请求详情
若上述方式仍不生效,可在测试执行后主动从WireMock拉取未匹配请求的完整信息:
@AfterEach void logUnmatchedRequests() { List<LoggedRequest> unmatchedRequests = WireMock.findAllUnmatchedRequests(); if (!unmatchedRequests.isEmpty()) { System.err.println("=== 未匹配请求详情 ==="); unmatchedRequests.forEach(request -> { System.err.println("请求方法: " + request.getMethod()); System.err.println("请求URL: " + request.getUrl()); System.err.println("请求Body: " + request.getBodyAsString()); System.err.println("请求头: " + request.getHeaders()); }); } }
内容的提问来源于stack exchange,提问作者Ram Tungala
相关产品推荐
相关产品推荐

