在@Rule运行之前如何使用Guice在Junit测试用例中注入依赖项?

时间:2015-07-07 10:29:52

标签: java junit4 guice dropwizard jukito

我正在使用的框架是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的空值资源。虽然Guice确实实例化了xyzProvider,但只有在评估了@Rule之后。现在我的问题是我希望Guice在评估@Rule之前注入依赖。有没有办法实现这一目标?

1 个答案:

答案 0 :(得分:4)

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

@Inject
private XyzAction xyz;

@Rule
public ResourceTestRule resources = ResourceTestRule
        .builder()
        .addResource(new AbcResource(() -> xyz))
        .build();