能否在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
相关产品推荐
相关产品推荐

