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

能否在Spock测试用例中使用@QuarkusTest替代JerseyTest?

能否在Spock测试用例中使用@QuarkusTest替代JerseyTest?

我有很多Spock规格测试用例,如下所示,它们作为项目资源类的“单元测试”。这是一个Open Liberty应用,现在需要迁移到Quarkus。

class ExampleResourceSpec extends ResourceSpecification {

    static final String BASE_URL = '/myurl'

    @Shared
    private ExampleService service

    @Override
    protected createResource() {
        service = Mock()
        new ExampleResource(service)
    }

    def '200 response for a successful request'() {
        given: 'a valid request'
        MyRequest request = fixtures.createMyRequest()
        def jsonReq = createJsonMyRequest(request)

        when: 'performing the post request'
        def response = jerseyPost(jsonReq, BASE_URL)

        then: 'the service is called with correct values'
        1 * photoService.handle({ actualRequest ->
            actualRequest.field1 == request.field1 &&
            actualRequest.field2 == request.field2 &&
            actualRequest.field3 == request.field3 
        })

        and: 'the resource returns 200 status code'
        response.status == Response.Status.OK.statusCode
    }

    private Response jerseyPost(String jsonReq, String url) {
        jerseyTest
                .target(url)
                .request()
                .post(Entity.json(jsonReq))
    }

    private createJsonMyRequest(MyRequest request) {
        def jsonSlurper = new JsonSlurper()
        def parsedJson = jsonSlurper.parseText(jsonb.toJson(request))

        return new JsonBuilder(parsedJson).toString()
    }
}

这些测试使用JerseyTest启动一个Grizzly服务器,并配置必要的资源配置,相关逻辑可以在下面的基类中看到:

abstract class ResourceSpecification extends Specification {

    JerseyTest jerseyTest

    protected abstract createResource();

    def setup() {
        jerseyTest = new JerseyTest() {
            @Override
            protected Application configure() {
                new ResourceConfig()
                        .register(createResource())
                        .register(MyAwesomeExceptionMapper)
            }
        }
        jerseyTest.setUp()
    }

    def parse(Response response) {
        jsonb.fromJson(response.readEntity(String), Map.class)
    }

    def cleanup() {
        jerseyTest.tearDown()
    }
}

然而迁移到Quarkus遇到了一些重大挑战,因为Quarkus目前并不支持Spock。此外,我们需要避免使用JerseyTest依赖,转而依靠Quarkus的能力来保留这些测试,特别是使用@QuarkusTest注解来启动服务器。正如你所想的,这类测试数量很多,我想尽量避免把它们全部重写成JUnit5测试。

我目前尝试过的方案:

  • 用RestAssured替代Jersey来发起HTTP请求,同时用GrizzlyHttpServerFactory启动服务器。这种方式能正常工作,但仍然违反了“避免外部依赖、依赖Quarkus能力”的要求。
  • 移除了GrizzlyHttpServerFactory,并在ResourceSpecification类上添加了@QuarkusTest注解,希望以此启动Quarkus服务器。但RestAssured无法和服务器建立连接,最终抛出了ConnectionException。

我猜测问题出在Spock和Quarkus的CDI容器ArC之间没有集成。

请问有没有办法实现我的需求?还是说我必须把测试重写成JUnit5?如果必须重写的话,有没有办法结合使用RestAssured和Mockito?我知道RestAssured主要用于集成测试。

备注:内容来源于stack exchange,提问作者Alex_Pap

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 11:19:08