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) 方法,而不是多次调用相同的方法。