Spring Boot 的 RestAssured 奇怪行为
RestAssured strage behaviour with SpringBoot
问题陈述 - 从 RestAssured 测试用例发送的路径参数接收为空。
API 定义如
@RequestMapping("myapp")
public interface MyApi {
@GetMapping(path = "getItem/{path1}/{path2}/{path3}")
public ResponseEntity<MyResponse> getItem(@PathVariable("path1") String path1,
@PathVariable("path2") String path2, @PathVariable("path3") String path3);
}
@RestController
public class MyController implements MyApi {
public ResponseEntity<MyResponse> getItem(String path1, String path2, String path3) {
return myService.delegateToMethod(path1, path2, path3);
}
}
这个设置很好并给出了结果。
简短描述的功能测试代码
部分测试class代码
@Test
public void getItemTest() {
MyResponse response = apiStub.callGetItem("1","2","3");
Assert.notNull(response);
}
部分存根 class
public MyResponse callGetItem(String param1, String param2, String param3) {
return given().port(servicePort)
.pathParam("path1", param1)
.pathParam("path2", param2)
.pathParam("path3", param3)
.when().get("/myapp/getItem/{path1}/{path2}/{path3}")
.then().statusCode(200)
.extract()
.as(MyResponse.class);
}
观察 测试断言失败。通过将调试点放在控制器 class 中,我看到路径值被接收为 null
What's Interesting 如果我直接将 API 定义放在控制器,它有效!
免责声明 为简洁起见,代码保持简短,应根据要求扩展部分。
Request 如果问题或错误重复,请求重定向。
您需要在 API 定义和执行控制器上加上 @RestController
。
@RestController
@RequestMapping("myapp")
public interface MyApi {
@GetMapping(path = "getItem/{path1}/{path2}/{path3}")
public ResponseEntity<MyResponse> getItem(@PathVariable("path1") String path1,
@PathVariable("path2") String path2, @PathVariable("path3") String path3);
}
更新 根本原因是 spring- 引导版本。我使用的是旧版本 (2.0.8.RELEASE
)。如上所述,API 和控制器的隔离不起作用。这样的终点结果,
http://localhost:8080/myapp/getItem/{path1}/{path2}/{path3}?path1=v1&path2=v2&path3=v3
相同的代码,升级到 spring-引导版本 2.4.5
,工作正常。
尝试将您的参数值存储在 Map 对象中并将其传递给 .pathParams(Map map)
方法,而不是多次调用相同的方法。
问题陈述 - 从 RestAssured 测试用例发送的路径参数接收为空。
API 定义如
@RequestMapping("myapp")
public interface MyApi {
@GetMapping(path = "getItem/{path1}/{path2}/{path3}")
public ResponseEntity<MyResponse> getItem(@PathVariable("path1") String path1,
@PathVariable("path2") String path2, @PathVariable("path3") String path3);
}
@RestController
public class MyController implements MyApi {
public ResponseEntity<MyResponse> getItem(String path1, String path2, String path3) {
return myService.delegateToMethod(path1, path2, path3);
}
}
这个设置很好并给出了结果。
简短描述的功能测试代码
部分测试class代码
@Test
public void getItemTest() {
MyResponse response = apiStub.callGetItem("1","2","3");
Assert.notNull(response);
}
部分存根 class
public MyResponse callGetItem(String param1, String param2, String param3) {
return given().port(servicePort)
.pathParam("path1", param1)
.pathParam("path2", param2)
.pathParam("path3", param3)
.when().get("/myapp/getItem/{path1}/{path2}/{path3}")
.then().statusCode(200)
.extract()
.as(MyResponse.class);
}
观察 测试断言失败。通过将调试点放在控制器 class 中,我看到路径值被接收为 null
What's Interesting 如果我直接将 API 定义放在控制器,它有效!
免责声明 为简洁起见,代码保持简短,应根据要求扩展部分。
Request 如果问题或错误重复,请求重定向。
您需要在 API 定义和执行控制器上加上 @RestController
。
@RestController
@RequestMapping("myapp")
public interface MyApi {
@GetMapping(path = "getItem/{path1}/{path2}/{path3}")
public ResponseEntity<MyResponse> getItem(@PathVariable("path1") String path1,
@PathVariable("path2") String path2, @PathVariable("path3") String path3);
}
更新 根本原因是 spring- 引导版本。我使用的是旧版本 (2.0.8.RELEASE
)。如上所述,API 和控制器的隔离不起作用。这样的终点结果,
http://localhost:8080/myapp/getItem/{path1}/{path2}/{path3}?path1=v1&path2=v2&path3=v3
相同的代码,升级到 spring-引导版本 2.4.5
,工作正常。
尝试将您的参数值存储在 Map 对象中并将其传递给 .pathParams(Map map)
方法,而不是多次调用相同的方法。