您使用什么技术来调试复杂的 guice 绑定?

我有一组复杂的绑定,其中包括许多私有绑定来解决机器人腿问题

由于 Guice 报告可理解的出价错误的能力有限,我想知道除了阅读 Guice 的运行时异常之外,还有哪些有效的工具或技术(如果有)可用于解决运行时绑定错误。

单步执行配置代码没有帮助,因为配置发生在启动时,而不是在对象实例化时发生,通常会发生错误。

如果Guice图插件有效,它可能会很有用 - 我对它的实验导致了不正确的图。


答案 1

这个答案中,我发现以下两个提示对调试很有用:

如果您编写泛型绑定帮助程序方法,并且 Guice 仅报告泛型帮助程序方法的行号,但您(最有可能)实际上希望调用方的行号在堆栈上一级,则 Binder.skipSources() 非常有用。

我正在为 Android 开发,因此从我修改绑定到我在设备或模拟器上看到更改的结果,构建时间可能会非常慢。因此,我开发了单元测试,可以直接在主机PC上验证Guice绑定。即使您不是针对 Android 进行开发,按如下方式编写 Guice 绑定单元测试也会很有帮助。现在,我的看起来像这样(在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中,然后将其注入A中,我将从C开始测试。如果单元测试 C 的绑定失败,我将开始注释掉 C 中的注入字段,直到绑定成功。然后,我沿着注入层次结构向上移动,重复此过程。

当然,如果您遵循测试驱动的开发,并确保在套件中包含全覆盖的 Guice 绑定测试,那么一旦中断绑定,您就会检测到这些错误。


答案 2