You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 16:27:17