2011-12-22 16 views
9

Mam złożony zestaw powiązań, które zawierają wiele prywatnych powiązań, aby rozwiązać robot legs problem.Jakie techniki są używane do debugowania złożonych wiązań guice?

Ze względu na ograniczoną zdolność Guice do zgłaszania zrozumiałych błędów, zastanawiam się, jakie skuteczne narzędzia lub techniki, jeśli takie istnieją, oprócz czytania wyjątków środowiska wykonawczego Guice są dostępne do rozwiązywania problemów związanych z błędami wiązania w czasie wykonywania.

Przejście przez kod konfiguracji nie jest pomocne, ponieważ konfiguracja odbywa się w czasie rozruchu, a nie w czasie tworzenia obiektu, gdzie zwykle występują błędy.

Wtyczka do wykresu Guice byłaby przydatna, gdyby zadziałała - moje eksperymenty z nią zaowocowały nieprawidłowymi wykresami.

+0

wykresy są rzeczywiście bardzo pomocne. musisz po prostu obejść styl = invis bug – wuppi

+0

możesz oznaczyć to java, więc otrzymamy kolorowanie kodu? – wuppi

Odpowiedz

6

znalazłem dwa następujące wskazówki przydatne do debugowania z this answer:

  • Grapher wizualizuje wtryskiwaczy. Jeśli Twój niestandardowy dostawca implementuje HasDependencies, może zwiększyć ten wykres.
  • Binder.skipSources() pozwala pisać rozszerzenia, których komunikaty o błędach prawidłowo śledzą numery linii.

Binder.skipSources() jest przydatna, jeśli piszesz ogólnych wiążących metody pomocnika i Guice informuje tylko numer wiersza generycznej metody pomocnika, ale (prawdopodobnie) faktycznie chcą numer linii dzwoniącego o jeden poziom wyżej w stosie zamiast.

Pracuję dla Androida, więc czas kompilacji może być dość wolny od czasu, w którym modyfikuję powiązania, dopóki nie zobaczę wyników moich zmian na urządzeniu lub symulatorze. Dlatego opracowałem testy jednostkowe, które sprawdzą powiązania Guice bezpośrednio na komputerze-hoście. Nawet jeśli nie rozwijasz się na Androida, pomocne może być napisanie testów jednostek wiążących Guice w następujący sposób. Teraz, kopalnia wyglądać mniej więcej tak (tu w Scala - Java będzie wyglądać podobnie)

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

Piszę testy począwszy od najgłębiej związanego klasie. Oznacza to, że jeśli C zostanie wstrzyknięte do B, które jest wstrzykiwane do A, rozpocznę testowanie w C. Jeśli testowanie wiązania C w jednostce zakończy się niepowodzeniem, zacznę komentować wstrzykiwane pola w C, dopóki nie otrzymam powiązania, aby odnieść sukces. Następnie poruszam się w górę hierarchii wtrysku, powtarzając ten proces.

Oczywiście, jeśli podążasz za rozwojem opartym na testach i upewnij się, że w pakiecie są włączone pełne testy wiązania guice, wykryjesz te błędy natychmiast po złamaniu powiązania.

Powiązane problemy