我创建了一个使用UriInfo
的REST Web服务:
class Endpoint implements Resource {
@Context
private UriInfo uriInfo;
@Override
public Response doMagic() {
// do magic
}
}
部署到我的容器中,效果很好,但是我也进行了Arquillian测试:
@Test
public void test(@ArquillianResteasyResource Resource api) throws Exception {
try (final Response response = api.doMagic()) {
// test magic
}
}
哪个抛出以下异常:
javax.ejb.EJBException: org.jboss.resteasy.spi.LoggableFailure: RESTEASY003880: Unable to find contextual data of type: javax.ws.rs.core.UriInfo
at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:186)
at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:275)
at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:330)
at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:238)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:509)
该异常是有意义的,Arquillian测试不是测试实际的REST Web服务,而是bean。因此,当然没有web服务上下文,其中包括UriInfo
。
我想解决这个问题,我必须以某种方式模拟UriInfo
。但是我找不到如何模拟注入了@Context
的bean的方法。我该怎么办?
答案 0 :(得分:0)
所以它不是完全在嘲笑,但至少现在可以使用了。我将代码更改为以下内容:
class Endpoint implements Resource {
@Override
public Response doMagic(@Context UriInfo uriInfo) {
// do magic
}
}
然后在我的测试用例中调用它:
@Test
public void test(@ArquillianResteasyResource Resource api) throws Exception {
try (final Response response = api.doMagic(new TestUriInfo())) {
// test magic
}
}
TestUriInfo
返回我想要的值。