You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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?或是我的实现方式完全错误?


解决方案

  1. 修改响应规格设置方式
    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)
    );
}
  1. 版本兼容性确认
    你的Serenity 4.2.16与Rest-Assured 5.3.0版本是官方兼容的,但如果后续仍有类似反射/方法未找到异常,可尝试升级Serenity到最新稳定版,确保框架内部对Rest-Assured的封装完全适配。

  2. 保留模板原有逻辑
    除了替换RestAssured.given()为RestRequests.given(),尽量保留模板生成的其他代码逻辑,避免手动修改封装层导致的API适配冲突。

内容的提问来源于stack exchange,提问作者Rokko_11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 06:43:21