Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 您使用什么技术来调试复杂的guice绑定?_Java_Debugging_Dependency Injection_Guice - Fatal编程技术网

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

Java 您使用什么技术来调试复杂的guice绑定?,java,debugging,dependency-injection,guice,Java,Debugging,Dependency Injection,Guice,我有一组复杂的绑定,其中包括许多私有绑定来解决问题 由于Guice报告可理解的BID错误的能力有限,我想知道除了读取Guice的运行时异常之外,还有什么有效的工具或技术可以用来排除运行时绑定错误 单步执行配置代码是没有帮助的,因为配置发生在引导时,而不是在对象实例化时(通常会发生错误) 如果Guice graph插件能够工作,它可能会很有用——我用它做的实验产生了不正确的图形。我发现以下两个技巧对调试非常有用: 可视化喷油器。如果您的自定义提供程序实现,它可以扩展此图 允许您编写错误消息正确跟

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

由于Guice报告可理解的BID错误的能力有限,我想知道除了读取Guice的运行时异常之外,还有什么有效的工具或技术可以用来排除运行时绑定错误

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


如果Guice graph插件能够工作,它可能会很有用——我用它做的实验产生了不正确的图形。

我发现以下两个技巧对调试非常有用:

  • 可视化喷油器。如果您的自定义提供程序实现,它可以扩展此图
  • 允许您编写错误消息正确跟踪行号的扩展名
如果您编写泛型绑定帮助器方法,并且Guice只报告泛型帮助器方法的行号,但您(很可能)实际上希望调用方的行号位于堆栈的上一级,则此选项非常有用

我是为Android开发的,所以从修改绑定到在设备或模拟器上看到更改结果,构建时间可能非常缓慢。因此,我开发了单元测试,可以直接在主机PC上验证Guice绑定。即使您不是为Android开发,也可以编写如下Guice绑定单元测试。现在,我的看起来像这样(在Scala中——Java看起来类似)

我从绑定最深的类开始编写测试。也就是说,如果C被注入B,B被注入A,我将在C开始测试。如果单元测试C的绑定失败,我将开始注释C中注入的字段,直到绑定成功。然后我向上移动注射层次结构,重复这个过程


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

这些图表实际上非常有用。您只需处理style=invis bug,您可以标记这个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])
    }   
}