2011-12-22 7 views
9

私はrobot legs problemを解決するために多くのプライベートバインディングを含む複雑なバインディングセットを持っています。複雑なguiceバインディングをデバッグするためにどのようなテクニックを使いますか?

Guiceの制限されたエラーを報告する能力が限られているため、実行時のバインディングエラーのトラブルシューティングにGuiceの実行時例外を読む以外に効果的なツールやテクニックがある場合は、

コンフィギュレーションコードの実行は、エラーが通常発生するオブジェクトインスタンス化時ではなく、ブート時に発生するため、役立たない。

Guiceグラフプラグインは、うまくいくと便利です - 私の実験結果が間違ったグラフになりました。

+0

グラフは実際にはかなり役に立ちます。あなたは単純にstyle = invisのバグを回避する必要があります – wuppi

+0

このjavaにタグを付けるとコードカラーが得られますか? – wuppi

答えて

6

私はthis answerからのデバッグに便利な次の二つのヒントが見つかりました:

  • Grapherインジェクタを可視化します。カスタムプロバイダがHasDependenciesを実装している場合は、このグラフを補うことができます。
  • Binder.skipSources()では、エラーメッセージが行番号を正しく追跡する拡張機能を作成できます。あなたは一般的な結合ヘルパーメソッドを書き、Guiceのが唯一のジェネリックヘルパーメソッドの行番号を報告しています(ほとんどの場合)は、実際にアップし、発信者1つのレベルの代わりに、スタックの行番号をしたい場合は

Binder.skipSources()に便利です。

私はAndroid用に開発していますので、デバイスやシミュレータの変更結果が表示されるまで、ビルドの時間がかなり遅くなることがあります。そこで私はホストPC上でGuiceバインディングを直接検証する単体テストを開発しました。 Android用に開発していない場合でも、Guiceバインディングユニットテストを以下のように記述すると便利です。今、私のこのようなものに見える(ここでは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でテストを開始します。ユニットテストCのバインディングが失敗した場合、バインドを成功させるまで、注入されたフィールドをCでコメントアウトします。そして、私はこのプロセスを繰り返す注入階層を上に移動します。

もちろん、テスト駆動開発に従っていて、あなたのスイートにフルカバレッジGuiceバインディングテストを含める場合は、バインディングを解除するとすぐにこれらのエラーを検出します。

関連する問題