WireMock POST请求单元测试返回404问题排查求助
看起来你遇到的核心问题有两个: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
相关产品推荐
相关产品推荐

