2011-12-22 12 views
9

Tengo un conjunto complejo de enlaces que incluyen muchas asociaciones privadas para resolver el robot legs problem.¿Qué técnicas usas para depurar enlaces complejos de guice?

Debido a la capacidad limitada de Guice de informar errores de licitación inteligibles, me pregunto qué herramientas o técnicas efectivas, si las hay, además de leer las excepciones de tiempo de ejecución de Guice están disponibles para solucionar los errores de enlace de tiempo de ejecución.

El paso por el código de configuración no es útil, porque la configuración ocurre en el momento del arranque en lugar del tiempo de creación de instancias de los objetos, donde generalmente ocurren errores.

El plugin de gráficos de Guice probablemente sería útil si funcionara; mis experimentos con él dieron como resultado gráficos incorrectos.

+0

los gráficos son en realidad bastante útiles. simplemente tiene que trabajar con el error style = invis – wuppi

+0

¿Puede etiquetar este java, para que tengamos colorido? – wuppi

Respuesta

6

He encontrado las siguientes dos consejos útiles para la depuración de this answer:

  • Grapher visualiza inyectores. Si su proveedor personalizado implementa HasDependencies, puede aumentar este gráfico.
  • Binder.skipSources() le permite escribir extensiones cuyos mensajes de error rastrean correctamente los números de línea.

Binder.skipSources() es útil si usted escribe métodos auxiliares de unión genéricos y Guice sólo informa del número de línea del método de ayuda genérica, pero (lo más probable) en realidad desea que el número de línea de la persona que llama en un nivel superior de la pila en su lugar.

Estoy desarrollando para Android, por lo que el tiempo de construcción puede ser bastante lento desde el momento en que modifico mis enlaces hasta que veo los resultados de mis cambios en el dispositivo o el simulador. Así que he desarrollado pruebas unitarias que verificarán los enlaces de Guice directamente en la PC host. Incluso si no está desarrollando para Android, puede ser útil escribir las pruebas de unidad de unión de Guice de la siguiente manera. En este momento, la mía ser algo como esto (aquí en Scala - Java tendría un aspecto similar)

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]) 
    } 
} 

escribo pruebas a partir de la clase más ligado profundamente. Es decir, si se inyecta C en B, que se inyecta en A, comenzaré a probar en C. Si la unidad que prueba el enlace de C falla, comenzaré a comentar los campos inyectados en C hasta que obtenga el enlace correcto. Luego me muevo por la jerarquía de inyección repitiendo este proceso.

Por supuesto, si sigue el desarrollo impulsado por pruebas y se asegura de incluir pruebas de encuadernación completa de Guice en su suite, detectará estos errores tan pronto como rompa una encuadernación.

Cuestiones relacionadas