TJWSEmbeddedJaxrsServer和ContainerRequestFilter

时间:2014-11-19 15:33:37

标签: groovy resteasy spock

我正在编写基于Spock的集成测试,以使用JAX-RS客户端API和TJWSEmbeddedJaxrsServer来测试我们的REST API。到目前为止,一切工作都非常顺利,但现在我想编写集成服务器请求过滤器的测试。

由于我的@Provider接口的ContainerRequestFilter类没有在运行时被发现和调用,我想问一下如何手动注册这个过滤器类?

你可以给我任何暗示吗?

@ContextConfiguration("classpath:applicationContextRestIntegrationTest.xml")
@ActiveProfiles(['local', 'compliance'])
@TestExecutionListeners([DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class])
class RestSpec extends Specification implements JaxrsInterceptorRegistryListener  {

    @Autowired
    ApplicationContext applicationContext
    @Autowired
    KsdApiSchemaRequestFilter filter

    @Override
    void registryUpdated(JaxrsInterceptorRegistry registry) {
        println "XXXX"
    }

    void "test the rest api"() {

        given:
        EmbeddedJaxrsServer server = new TJWSEmbeddedJaxrsServer()
        server.port = 9999
        server.start()

        def dispatcher = server.getDeployment().getDispatcher()
        //dispatcher.registry.getResourceInvoker()
        dispatcher.providerFactory.clientRequestFilters.listeners.add(this) // would like to register an instance of MethodResourceInvoker
        dispatcher.providerFactory.clientRequestFilters.registerSingleton(filter)
        dispatcher.registry.addResourceFactory(new SpringResourceFactory('complianceTestResource', applicationContext, ComplianceTestResource.class))

        def url = 'http://localhost:9999//v1/compliancetest'

        def client = ClientBuilder.newBuilder().property('connection.timeout', 1).register(JacksonJsonProvider.class).build()

        when:
        Response response = client.target(url).request(APPLICATION_JSON_VALUE).options()

        then:
        response.status == 200

        cleanup:
        server.stop()
    }
}

编辑1 我的ContentRequestFilter是一个Spring Bean,因此我必须注册Spring bean的实例。

clientRequestFilters.registerSingleton(..)实际注册了我的过滤器,但由于底层MethodResourceInvoker未在listener中注册为registry,并且注册表在运行时使用此invokerregisterSingleton未获得propagated

有没有办法在我的Spock测试中获取此MethodResourceInvoker的实例?我需要它将它添加到clientRequestFactory的监听器列表中(参见我上面的列表)

1 个答案:

答案 0 :(得分:2)

只需使用dispatcher.providerFactory.register(requestFilterInstance),clientRequestFilters仅用于客户端,而不用于您的服务器。

providerFactory.register()可用于类和已配置的实例,例如SpringBeans。