你使用哪些技术来调试复杂的Guice绑定?

16

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

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

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

如果可以正常工作,Guice图插件可能会很有用-我的实验结果显示它产生了不正确的图形。


这些图表实际上非常有帮助。你只需要解决一下style=invis的bug就可以了。 - wuppi
你能标记一下这个Java代码吗?这样我们就能获得代码着色了。 - wuppi
1个回答

7

我发现以下两个提示对于从此答案进行调试很有用:

Binder.skipSources()对于编写通用绑定帮助方法且Guice仅报告通用帮助方法的行号但您(最有可能)实际上想要调用者栈顶部分一级的行号很有用。

我正在开发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中,B被注入到A中,我会从C开始测试。如果单元测试C的绑定失败,我会注释掉C中的注入字段,直到绑定成功为止。然后我沿着注入层次结构向上移动,重复这个过程。
当然,如果你遵循测试驱动开发,并确保在测试套件中包含完全覆盖Guice绑定的测试,你将在打破绑定时立即检测到这些错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接