4

我正在使用的框架是 Dropwizard 7、Guice,我们使用 Junit 和 Jukito 进行测试。我有一个用 dw 编写的资源,我需要编写一个与该资源对应的测试用例。注意:我们最近从 dw 6 迁移到 dw 7。

在 dw 6 中,我们有如下测试用例:

@RunWith(JukitoRunner.class)
public class AbcResourceTest extends ResourceTest{
  @Inject
  private Provider<XyzAction> xyzProvider;
  public void setUpResources() throws Exception {
   addResource(new AbcResource(xyzProvider));
  }
  @Test
  public void doTesting() {
  }
}

这种方法工作得很好,Guice 会注入所有依赖项,资源也会很好地初始化。

但在 DW 7 中,编写资源测试的语法更改为以下

public class ResourceTest {
 PersonDao personDao = mock(PersonDao.class);
 @Rule public ResourceTestRule resources = ResourceTestRule
      .builder()
      .addResource(new Resource(personDao))
      .build();
}

这是 dw 文档中的一个示例,并且工作正常。但是,如果我尝试注入这样的东西,而不是嘲笑 PersonDao:

@RunWith(JukitoRunner.class)
public class AbcResourceTest {
  @Inject
  private Provider<XyzAction> xyzProvider;
 @Rule public ResourceTestRule resources = ResourceTestRule
      .builder()
      .addResource((new AbcResource(xyzProvider))
      .build();
  @Test
  public void doTesting() {
  }
}

此代码使用 xyzProvider 的 null 值实例化资源。尽管 Guice 确实实例化了 xyzProvider 但仅在评估了 @Rule 之后。现在我的问题是我希望 Guice 在评估 @Rule 之前注入依赖项。有没有办法做到这一点?

4

1 回答 1

4

我怀疑这会导致在运行JukitoRunner之前发生注入。但它不能做的是在构造函数完成之前导致注入发生。像这样的东西可能会起作用(Java 8 语法):@Rule

@Inject
private XyzAction xyz;

@Rule
public ResourceTestRule resources = ResourceTestRule
        .builder()
        .addResource(new AbcResource(() -> xyz))
        .build();
于 2015-07-07T23:31:59.487 回答