Spring Boot JUnit测试:如何从WireMock返回响应并获取Token
解决Spring Boot JUnit测试中WireMock返回响应并获取Token的问题
步骤1:完善WireMock的Stub配置
你当前的WireMock Stub仅设置了响应状态和头部,缺少返回的JSON响应体。需要补充withBody()方法,返回与JWTResponse结构匹配的模拟JSON数据:
wireMockserver.stubFor(get("/authenticate/login") .willReturn(aResponse() .withStatus(HttpStatus.OK.value()) .withHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE) // 构造符合JWTResponse结构的模拟JSON .withBody("{\n" + " \"token\": \"mock-jwt-token-12345\",\n" + " \"type\": \"Bearer\",\n" + " \"refreshToken\": \"mock-refresh-token-67890\",\n" + " \"id\": 1,\n" + " \"username\": \"test-user\",\n" + " \"email\": \"test@example.com\",\n" + " \"roles\": [\"ROLE_USER\", \"ROLE_ADMIN\"]\n" + "}")));
步骤2:调用WireMock接口并解析响应
在JUnit测试方法中,使用Spring的RestTemplate或WebClient发送请求到WireMock接口,将响应转换为JWTResponse对象后即可获取Token:
方式1:使用RestTemplate(同步场景)
@Test void testLoginAndGetToken() { RestTemplate restTemplate = new RestTemplate(); // 发送GET请求到WireMock服务地址 String url = "http://localhost:8080/authenticate/login"; JWTResponse jwtResponse = restTemplate.getForObject(url, JWTResponse.class); // 提取Token String token = jwtResponse.getToken(); // 可添加断言验证结果 assertNotNull(token); }
方式2:使用WebClient(响应式场景)
如果项目采用响应式架构,可使用WebClient:
@Test void testLoginAndGetTokenWithWebClient() { WebClient webClient = WebClient.create("http://localhost:8080"); JWTResponse jwtResponse = webClient.get() .uri("/authenticate/login") .retrieve() .bodyToMono(JWTResponse.class) .block(); // 测试场景下阻塞获取结果 String token = jwtResponse.getToken(); assertNotNull(token); }
关键注意点
- 确保WireMock配置的端口(8080)与测试请求的端口一致;
- 模拟JSON的字段名、数据类型必须和
JWTResponse类的属性完全匹配; - 若
JWTResponse的type字段有默认值,模拟JSON中可省略该字段,Jackson会自动填充默认值。
内容的提问来源于stack exchange,提问作者Sercan Noyan Germiyanoğlu
相关产品推荐
相关产品推荐

