6

我在使用 Dropwizard: 0.6.1 (jersey 1.15) 运行 resourceTest 时遇到了“缺少依赖项”异常,有没有人有过这种情况的经验?

我的测试文件

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
4

3 回答 3

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资源注册,就可以保证每个请求都有一个新实例,这应该避免线程问题。

于 2012-12-18T16:09:32.153 回答
2

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

在一天结束的时候,我最终得到了一份 jenkins 的工作,其中包含一些集成测试(在 python 中)来测试我的 Web 服务。例如。部署后,触发一些http请求,检查响应代码和响应内容。事实证明要容易得多。

于 2013-04-01T09:24:00.970 回答
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。这里的额外优势是您的派生可测试类可以为上下文注入(例如)硬编码值以创建一些合适的测试场景。

于 2015-08-19T14:34:42.417 回答