有没有办法在不创建实际实例的情况下测试Guice绑定?

时间:2013-06-12 16:05:24

标签: guice

我想编写guice模块的单元测试以验证绑定。最简单的方法是创建一个注入器并验证返回实例的类型。

这种方法的问题是那些带有副作用的实现类。

有没有办法测试哪些类型在Guice模块中绑定而不实际创建实例

1 个答案:

答案 0 :(得分:2)

可以使用Element SPI解决问题。对DefaultElementVisitor进行子类化并编写实现以访问您需要测试的Bindings。例如,

public class MyElementVisitor extends DefaultElementVisitor<Void>{

  @Override
  public <String> Void visit(Binding<String> binding) {
      Key<String> key = binding.getKey();
      System.out.println("Key :" + key.getTypeLiteral());
      System.out.println("Annotation : " + key.getAnnotation());
      System.out.println("Source : " + binding.getSource());
      return visitOther(binding);
  }

}

测试代码可以用visit(...)方法编写。 这种被称为模块绑定的绑定(因此可以操作)是不完整的。原因是没有实现存在要注入。要访问这些绑定,我们需要迭代我们打算访问的模块。准备一个模块列表并将其作为Elements.getElements()的第二个参数传递给它。

    MyElementVisitor defaultElementVisitor = new MyElementVisitor();
    for(Element element : Elements.getElements(Stage.DEVELOPMENT,modules)){
        element.acceptVisitor(defaultElementVisitor);
    }

此方法的优点是您无需准备Injector进行分析。