Dropwizard / Jersey - 运行测试时缺少公共方法的依赖项

时间:2012-12-13 14:25:55

标签: jersey dropwizard

我在使用Dropwizard运行resourceTest时遇到了“Missing dependency”异常:0.6.1(jersey 1.15),有没有人有这方面的经验?

我的测试文件

public class MyResourceImplTest extends ResourceTest {
   ........
    @Override
    protected void setUpResources() throws Exception {
        addResource(new MyResourceImpl(new myConfiguration()));
    }
}

异常

Dec 13, 2012 2:10:41 PM com.sun.jersey.test.framework.spi.container.inmemory.InMemoryTestContainerFactory$InMemoryTestContainer <init>
INFO: Creating low level InMemory test container configured at the base URI http://localhost:9998/
Dec 13, 2012 2:10:42 PM com.sun.jersey.test.framework.spi.container.inmemory.InMemoryTestContainerFactory$InMemoryTestContainer start
INFO: Starting low level InMemory test container
Dec 13, 2012 2:10:42 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.15 10/30/2012 02:40 PM'
Dec 13, 2012 2:10:42 PM com.sun.jersey.spi.inject.Errors processErrorMessages
SEVERE: The following errors and warnings have been detected with resource and/or provider classes:
  SEVERE: Missing dependency for method public javax.ws.rs.core.StreamingOutput com.****************.********(javax.servlet.http.HttpServletRequest,java.lang.String,java.lang.String) at parameter at index 0
Dec 13, 2012 2:10:42 PM com.sun.jersey.test.framework.spi.container.inmemory.InMemoryTestContainerFactory$InMemoryTestContainer stop
INFO: Stopping low level InMemory test container

3 个答案:

答案 0 :(得分:2)

看起来泽西岛无法注入HttpServletRequest

您的其中一个端点配置如下吗?

public StreamingOutput something(@Context HttpServletRequest request, String a, String b) {}

如果是这样,您可能需要重新考虑您的设计,而选择

@Context
private HttpContext context;

public StreamingOutput something(String a, String b) {

  System.out.println("Request info "+context.getRequest().getAbsolutePath());

}

这可能会产生更清洁的方法。只要您依赖Class资源注册,就可以保证每个请求都有一个新实例,这样可以避免线程问题。

答案 1 :(得分:2)

我的问题是,我注入了一个由InMemory容器支持的HttpServletRequest,在这种情况下我需要使用jetty grizzlyWebTestContainer或jetty作为测试contatiner。我也没有那么努力,因为在jersey-test-framework-grizzly中引入确实带来了很多针对dropwizard本身的依赖冲突。我认为尝试解决所有冲突是不值得的,因为当我将来升级dropwizard时,这可能会再次发生。

在一天结束时,我最终在jenkins工作中使用了一些集成测试(在python中)来测试我的Web服务。例如。部署之后,触发一些http请求,检查响应代码和响应内容。事情变得更容易。

答案 2 :(得分:0)

我解决这个问题的方法是在没有注入上下文的情况下定义一个抽象的基类资源,然后为你的真实服务实现一个微小的派生类。

@Path("/contextMethod")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class MyResourceWithContext extends BaseResource {
    @Context
    private HttpServletRequest request;

    protected String getUserID()
    {
        return request.getRemoteUser();
    }
}

运行测试时,然后实现一个备用派生类,仅用于测试,它不使用HttpServletRequest。这里的额外优势在于,派生的可测试类可以为上下文创建一个硬编码值,以创建一些合适的测试场景。