我有一组复杂的绑定,其中包括许多用于解决机器人腿问题的私有绑定。
由于Guice报告可理解的绑定错误的能力有限,我想知道除了阅读Guice的运行时异常之外,还有什么有效的工具或技术(如果有的话)可用于排除运行时绑定错误。
分步执行配置代码是没有帮助的,因为配置是在引导时进行的,而不是在对象实例化时进行的,而对象实例化通常会出现错误。
Guice graph插件如果能工作的话可能会很有用——我对它的实验导致了不正确的图形。
从这个答案中,我发现以下两个技巧对调试很有用:
- Grapher可视化注入器。如果你的自定义提供者实现了HasDependencies,它可以扩展这个图。
- Binder.skipSources()允许您编写其错误消息正确跟踪行号的扩展。
bind . skipsources()是有用的,如果你编写泛型绑定帮助方法,而Guice只报告泛型帮助方法的行号,但你(很可能)实际上想要的是堆栈上一级调用者的行号。
我正在为Android开发,所以从我修改绑定到我在设备或模拟器上看到我的更改结果的构建时间可能相当慢。因此,我开发了单元测试,可以直接在主机PC上验证Guice绑定。即使您不针对Android进行开发,编写gui绑定单元测试也会很有帮助,如下所示。现在,我的代码看起来像这样(这里是Scala——Java看起来类似)
class ProviderTest {
var injector : Injector = null
@Before
def setUp() {
injector = Guice.createInjector(
new BindModule1(),
new BindModule2(),
new BindGlobals()
)
}
@After
def tearDown() {
}
@Test def InjectedClass1WasBound() {
val provider = injector.getProvider(classOf[InjectedClass1])
}
@Test def InjectedClass2WasBound() {
val provider = injector.getProvider(classOf[InjectedClass2])
}
}
我从最深入的绑定类开始编写测试。也就是说,如果C被注入到B中,B又被注入到A中,我将开始在C中进行测试。如果单元测试C的绑定失败,我将开始注释C中注入的字段,直到绑定成功。然后我沿着注入层次结构往上移动,重复这个过程。
当然,如果您遵循测试驱动开发,并确保在您的套件中包含全覆盖的向导绑定测试,那么您将在破坏绑定时立即检测到这些错误。