使用OpenAPI Generator生成Serenity-BDD Rest-Assured测试遇异常求助
问题:Serenity-BDD + Rest-Assured生成测试执行异常处理
我需要针对一份无法管控的OpenAPI规范编写测试,计划通过OpenAPI Generator生成由Serenity-BDD框架装饰的Rest-Assured测试。
我的build.gradle.kts配置如下:
dependencies { implementation("jakarta.annotation:jakarta.annotation-api:2.1.1") implementation("io.rest-assured:rest-assured:5.3.0") implementation("com.squareup.okio:okio:3.4.0") implementation("io.gsonfire:gson-fire:1.8.5") implementation("net.serenity-bdd:serenity-core:4.2.16") implementation("net.serenity-bdd:serenity-junit5:4.2.16") implementation("net.serenity-bdd:serenity-rest-assured:4.2.16") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } openApiGenerate { generatorName.set("java") library.set("rest-assured") templateDir.set("$rootDir/templates/rest-assured-serenity") inputSpec.set("$rootDir/open-api.json") outputDir.set("$buildDir/generated") apiPackage.set("com.example.api") modelPackage.set("com.example.model") configOptions.set( mapOf( "useJakartaEe" to "true", "interfaceOnly" to "true", "useTags" to "true", "dateLibrary" to "java8" ) ) }
我从OpenAPI Generator仓库复制了rest-assured模板文件到本地项目,添加了import net.serenitybdd.rest.RestRequests导入,并修改execute方法,用Serenity的RestRequests.given()替代RestAssured的given():
/** * {{httpMethod}} {{{path}}} * @param handler handler * @param <T> type * @return type */ @Override public <T> T execute(Function<Response, T> handler) { return handler.apply(RestRequests.given().spec(reqSpec.build()).expect().spec(respSpec.build()).when().request(REQ_METHOD, REQ_URI)); }
代码可正常编译,但执行时出现如下异常:
Receiver class net.serenitybdd.rest.decorators.ResponseSpecificationDecorated$ByteBuddy$ypwvjVrL does not define or inherit an implementation of the resolved method 'abstract io.restassured.specification.ResponseSpecification spec(io.restassured.specification.ResponseSpecification)' of interface io.restassured.specification.ResponseSpecification.
请问我应使用哪种ResponseSpecificationDecorator?或是我的实现方式完全错误?
解决方案
- 修改响应规格设置方式
Serenity的ResponseSpecificationDecorated对Rest-Assured 5.x的spec(ResponseSpecification)链式调用适配存在问题,直接替换为responseSpecification()方法即可,无需调用expect():
@Override public <T> T execute(Function<Response, T> handler) { return handler.apply( RestRequests.given() .spec(reqSpec.build()) .responseSpecification(respSpec.build()) // 替换原有的expect().spec() .when() .request(REQ_METHOD, REQ_URI) ); }
版本兼容性确认
你的Serenity 4.2.16与Rest-Assured 5.3.0版本是官方兼容的,但如果后续仍有类似反射/方法未找到异常,可尝试升级Serenity到最新稳定版,确保框架内部对Rest-Assured的封装完全适配。保留模板原有逻辑
除了替换RestAssured.given()为RestRequests.given(),尽量保留模板生成的其他代码逻辑,避免手动修改封装层导致的API适配冲突。
内容的提问来源于stack exchange,提问作者Rokko_11
相关产品推荐
相关产品推荐

