我们有一个使用 Guice 和 Guice Servlet 扩展实例化的 Java Web 应用程序。该应用程序还包括由 Guice 实例化的 Quartz 作业。我想为这些工作编写单元测试。
作业类依赖于我们生产代码中的其他其他类,这些类需要Provider<HttpServletRequest>
. 在生产设置中,Guice 可以成功实例化作业,并且作业按预期工作,因为它们从不调用其协作者上的任何代码,这些代码会触发get
servlet 请求提供者上的 a。这样的get
调用会失败,因为作业是由某个工作线程执行的,而不是作为对 servlet 的 HTTP 请求的一部分。
现在我的问题是如何在 JUnit 测试中设置 Guice,以便获得相同的行为,即可以实例化作业类,但所有使用范围外@RequestScoped
对象的尝试都会失败。
有两种简单的解决方案,但它们对我不起作用。
如果我不绑定任何HttpServletRequest
,则在尝试在测试设置中实例化作业时会出现错误:
com.google.inject.CreationException: Guice creation errors:
1) No implementation for javax.servlet.http.HttpServletRequest was bound.
while locating com.google.inject.Provider<javax.servlet.http.HttpServletRequest>
另一方面,如果我只是绑定模拟实例,例如
@Override
protected void configure() {
bind(HttpServletRequest.class).toInstance(mock(HttpServletRequest.class));
}
然后可以实例化作业,但是如果作业使用 servlet 请求实例,我将不再收到测试错误。那么如何创建绑定以便 Guice 能够实例化提供程序,但对提供程序的任何使用都会失败?