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

时间:2011-12-22 19:09:32

标签: java debugging dependency-injection guice

我有一组复杂的绑定,包括许多私有绑定来解决robot legs problem

由于Guice报告可理解的重叠错误的能力有限,我想知道除了阅读Guice的运行时异常以外,还有哪些有效的工具或技术可以解决运行时绑定错误。

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

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

1 个答案:

答案 0 :(得分:7)

我发现以下两个提示对this answer的调试非常有用:

如果您编写通用绑定帮助程序方法,并且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绑定测试,您将在打破绑定后立即检测到这些错误。