有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在使用的框架是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实例化具有空值的资源。尽管GUI确实实例化了xyzProvider,但仅在对@Rule求值之后。现在我的问题是,我希望Guice在计算@Rule之前注入依赖项。有没有办法做到这一点


共 (1) 个答案

  1. # 1 楼答案

    我怀疑JukitoRunner会导致在@Rule运行之前发生注射。但它不能做的是在构造函数完成之前导致注入发生。类似的方法可能会奏效(Java 8语法):

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