我想编写 guice 模块的单元测试以验证绑定。最简单的方法是创建一个注入器并验证返回实例的类型。
这种方法的问题是那些具有副作用的实现类。
有没有办法在 不实际创建实例的情况下测试 Guice 模块中绑定了哪些类型?
我想编写 guice 模块的单元测试以验证绑定。最简单的方法是创建一个注入器并验证返回实例的类型。
这种方法的问题是那些具有副作用的实现类。
有没有办法在 不实际创建实例的情况下测试 Guice 模块中绑定了哪些类型?
可以使用 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);
}
这种方法的优点是您无需准备进样器进行分析。