1

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

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

有没有办法在 不实际创建实例的情况下测试 Guice 模块中绑定了哪些类型?

4

1 回答 1

2

可以使用 Element SPI 解决该问题。继承 DefaultElementVisitor 并编写访问您需要测试的绑定的实现。例如

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);
    }

这种方法的优点是您无需准备进样器进行分析。

于 2013-06-13T09:00:58.550 回答