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

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

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

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

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

我从以下答案中发现了以下两个有用的调试技巧:

  • Grapher可视化注射器。 如果您的自定义提供程序实现了HasDependencies ,则可以扩充此图形。
  • Binder.skipSources()允许您编写其错误消息正确跟踪行号的扩展。

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

我正在为Android开发,所以从我修改绑定到构建器或模拟器上的更改结果之前,构建时间可能非常慢。 所以我开发了unit testing,可以直接在主机PC上validationGuice绑定。 即使你不是为Android开发,编写Guice绑定unit testing也会有所帮助。 现在,我看起来像这样(在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测试。如果unit testingC的绑定失败,我将开始注释C中的注入字段,直到我获得绑定成功。 然后我按照注入层次结构重复此过程。

当然,如果您遵循测试驱动开发,并确保在您的套件中包含全覆盖Guice绑定测试,您将在破坏绑定后立即检测到这些错误。