2011-12-22 8 views
9

Ho un insieme complesso di associazioni che include molti binding privati ​​per risolvere lo robot legs problem.Quali tecniche si utilizzano per eseguire il debug di complessi collegamenti guiz?

A causa della limitata capacità di Guice di segnalare errori di bisso intelligibili, mi chiedo quali strumenti o tecniche efficaci, se ce ne sono, oltre a leggere le eccezioni di runtime di Guice sono disponibili per la risoluzione degli errori di runtime.

Il passaggio al codice di configurazione non è utile, poiché la configurazione avviene al momento dell'avvio piuttosto che al momento dell'istanza dell'oggetto, dove si verificano di solito gli errori.

Il plugin grafico Guice sarebbe probabilmente utile se ha funzionato - i miei esperimenti con esso hanno portato a grafici non corretti.

+0

i grafici sono in realtà piuttosto utili. devi semplicemente aggirare lo style = invis bug – wuppi

+0

puoi taggare questo java, quindi otteniamo il color-code? – wuppi

risposta

6

ho trovato i seguenti due consigli utili per il debug da this answer:

  • Grapher visualizza iniettori. Se il tuo fornitore personalizzato implementa HasDependencies, può aumentare questo grafico.
  • Binder.skipSources() consente di scrivere estensioni i cui messaggi di errore tracciano correttamente i numeri di riga.

Binder.skipSources() è utile se si scrive metodi di supporto vincolanti generici e Guice riporta solo il numero di riga del metodo di supporto generico, ma voi (molto probabilmente) in realtà desidera che il numero di riga del chiamante livello superiore dello stack, invece.

Sto sviluppando per Android, quindi il tempo di compilazione può essere piuttosto lento dal momento in cui modifico i binding fino a quando vedo i risultati delle mie modifiche sul dispositivo o sul simulatore. Quindi ho sviluppato test unitari che verificheranno i binding Guice direttamente sul PC host. Anche se non stai sviluppando per Android, può essere utile scrivere i test delle unità vincolanti di Guice come segue. In questo momento, il mio aspetto simile a questo (qui in Scala - Java sarebbe simile)

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

scrivo test a partire dalla classe più profondamente legato. Ad esempio, se C viene iniettato in B, che viene iniettato in A, inizierò il test su C. Se l'unità che sta testando l'associazione di C fallisce, inizierò a commentare i campi iniettati in C finché non avrò ottenuto il binding. Quindi mi muovo lungo la gerarchia dell'iniezione ripetendo questo processo.

Naturalmente, se segui lo sviluppo basato sui test e assicurati di includere test di copertura Guice a copertura totale nella tua suite, rileveresti questi errori non appena interromperesti una rilegatura.

Problemi correlati