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

Dropwizard/Jersey-运行测试时缺少公共方法的依赖项,jersey,dropwizard,Jersey,Dropwizard,我在使用Dropwizard运行resourceTest时遇到了“缺少依赖项”异常:0.6.1(jersey 1.15),有人有过这种情况的经验吗 我的测试文件: public class MyResourceImplTest extends ResourceTest { ........ @Override protected void setUpResources() throws Exception { addResource(new MyResour

我在使用Dropwizard运行resourceTest时遇到了“缺少依赖项”异常: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
异常

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
2012年12月13日下午2:10:41 com.sun.jersey.test.framework.spi.container.inmemory.InMemoryTestContainer工厂$InMemoryTestContainer
信息:创建在基本URI上配置的低级别InMemory测试容器http://localhost:9998/
2012年12月13日下午2:10:42 com.sun.jersey.test.framework.spi.container.inmemory.InMemoryTestContainer工厂$InMemoryTestContainer开始
信息:启动低级别内存测试容器
2012年12月13日下午2:10:42 com.sun.jersey.server.impl.application.WebApplicationImpl\u启动
信息:正在启动Jersey应用程序,版本为“Jersey:1.15 10/30/2012 02:40 PM”
2012年12月13日下午2:10:42 com.sun.jersey.spi.inject.Errors processErrorMessages
严重:在资源和/或提供程序类中检测到以下错误和警告:
严重:缺少索引0处参数处的方法public javax.ws.rs.core.StreamingOutput com.**********************(javax.servlet.http.HttpServletRequest、java.lang.String、java.lang.String)的依赖项
2012年12月13日下午2:10:42 com.sun.jersey.test.framework.spi.container.inmemory.InMemoryTestContainer工厂$InMemoryTestContainer停止
信息:正在停止内存中的低级别测试容器

看起来Jersey无法注入
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());

}

这可能会产生一种更干净的方法。只要您依赖于
资源注册,那么就可以保证每个请求都有一个新实例,从而避免线程问题。

我的问题是,我注入了InMemory容器支持的HttpServletRequest,在这种情况下,我需要使用jetty grizzlyWebTestContainer或jetty作为测试容器。我也没有完全做到这一点,因为在jersey测试框架中引入grizzly确实会给dropwizard本身带来很多依赖冲突。我确认不值得尝试解决所有冲突,因为将来升级dropwizard时,这种情况可能会再次发生


最后,我得到了一份jenkins的工作,其中包含一些集成测试(用python)来测试我的web服务。部署后,启动一些http请求,检查响应代码和响应内容。事实证明,这要容易得多。

我解决这个问题的方法是定义一个抽象基类资源,而不注入上下文,然后为您的实际服务实现一个微小的派生类

@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。这里的额外优势是,派生的可测试类可以在文本(比如)中为上下文添加硬编码值,以创建一些合适的测试场景。

谢谢,我注意到HttpServletRequest不能被注入。但是在我的例子中,我想通过调用HttpServletRequest.getAttribute(“blabla”)来获取请求属性,HttpContext似乎没有提供该属性。不确定它是否会帮助您,但这里有一些关于属性提取的讨论:我也有同样的问题。有人已经修好了吗?我还做了一些blabla(@Context-HttpServletRequest,…),它可以工作,但在测试中失败了。如果我使用HttpContext,那么我需要servlet过滤器设置的头。如何从HttpContext接口中获取此标头?有什么想法吗?您可能想使用
HttpHeaders
。有关示例,请参见。那里的整个项目都使用Dropwizard,因此可能会回答您可能遇到的其他问题(例如,使用HAL)。您找到答案了吗?我遇到了类似的问题是的,我的问题是,我注入了一个InMemory容器支持的HttpServletRequest,在这种情况下,您需要使用jetty grizzlyWebTestContainer或jetty。但最后,我用python编写了一个集成测试来测试我的web服务。事实证明,这要容易得多。