我正在编写基于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
,并且注册表在运行时使用此invoker ,registerSingleton
未获得propagated。
有没有办法在我的Spock测试中获取此MethodResourceInvoker
的实例?我需要它将它添加到clientRequestFactory
的监听器列表中(参见我上面的列表)
答案 0 :(得分:2)
只需使用dispatcher.providerFactory.register(requestFilterInstance)
,clientRequestFilters仅用于客户端,而不用于您的服务器。
providerFactory.register()
可用于类和已配置的实例,例如SpringBeans。