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

WireMock POST请求单元测试返回404问题排查求助

解决WireMock单元测试404及Cookie返回验证问题

看起来你遇到的核心问题有两个:WireMock的Stub配置逻辑错误,以及登录方法里的URL参数格式存在问题。咱们一步步来修复:

1. 修正WireMock Stub的Cookie配置逻辑

你现在用的withCookie()方法是用来匹配客户端请求中携带的Cookie,但你实际想要的是让WireMock在响应里返回Cookie。这个方法的位置完全错了,应该把它放到willReturn(aResponse())的链式调用里,用来配置响应内容:

@Test
public void TestLoginShouldReturnCookie1() {
    // 注意:这里的URL参数用&而非&,和后续登录方法的修正对应
    stubFor(post(urlEqualTo(myURL+"/Login?username=admin&password=test&_spring_security_remember_me=true&submit=Login%20Name"))
            .willReturn(aResponse()
                    .withStatus(200)
                    // 将withCookie移到aResponse内,设置响应要返回的Cookie
                    .withCookie("COOKIE", REMEMBER_ME)));
    String cookie = loginService.Login();
    assertEquals(REMEMBER_ME, cookie);
}

2. 修正登录方法里的URL参数格式

你登录方法里的URL用了&(HTML转义字符),这是错误的——URL里的参数分隔符应该是原始的&。&仅在HTML文档中编写URL时需要转义,直接在Java代码里构造URL应该使用&:

public String Login() {
    // 修正参数分隔符为&,移除HTML转义的&
    String loginURL = baseURL+"/Login?username=admin&password=test&_spring_security_remember_me=true&submit=Login Name";
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
    HttpEntity<String> request = new HttpEntity<String>(headers);
    RestTemplate restTemplate = new RestTemplate();
    HttpEntity<String> response = restTemplate.exchange(loginURL, HttpMethod.POST, request, String.class);
    HttpHeaders headerResponse = response.getHeaders();
    cookie = headerResponse.getFirst(HttpHeaders.SET_COOKIE);
    return cookie;
}

为什么之前会出现404?

看WireMock的报错信息,它提示的"Closest match"里包含了cookies匹配条件,但你的实际请求里并没有携带任何Cookie("cookies" : { }),所以Stub完全不匹配,返回了404。把withCookie移到响应配置里后,Stub就不会再要求请求携带Cookie,而是会在响应里返回你需要的Cookie。

另外,如果你想让测试更鲁棒(比如兼容参数顺序变化的情况),可以用urlPathEqualTo配合queryParam来匹配参数,而非严格匹配整个URL:

stubFor(post(urlPathEqualTo("/Login"))
        .withQueryParam("username", equalTo("admin"))
        .withQueryParam("password", equalTo("test"))
        .withQueryParam("_spring_security_remember_me", equalTo("true"))
        .withQueryParam("submit", equalTo("Login Name"))
        .willReturn(aResponse()
                .withStatus(200)
                .withCookie("COOKIE", REMEMBER_ME)));

内容的提问来源于stack exchange,提问作者SkyBlue

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:37:52