如何在Arquillian测试中模拟UriInfo

时间:2018-09-20 08:49:01

标签: java java-ee

我创建了一个使用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的方法。我该怎么办?

1 个答案:

答案 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返回我想要的值。