我想编写guice模块的单元测试以验证绑定。最简单的方法是创建一个注入器并验证返回实例的类型。
这种方法的问题是那些带有副作用的实现类。
有没有办法测试哪些类型在Guice模块中绑定而不实际创建实例?
答案 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进行分析。