Dagger2を味見してみた、Dependency Injectionに関して今更だけど学んだを経て、Dagger2を触ってみました。
簡単な、Injectionの機構を使って、依存関係のある場所をテスト時だけ異なる依存関係にしてテストを実施する、というところまで達成できました。よかったよかった。そして、ある程度理解できたので、あとは実際の実装に落とし込みながらなじませる、が必要そう。
確認した内容はごくごく簡単で、表示する文言をビルド環境によって変更するというもの。Dagger2では、injectionするために@Moduleのアノテーション、@Providerのアノテーションつけられたものに対して以下のようにModuleをセットします。そこで、 SampleTestModule のように依存関係を拡張したModuleを渡してあげれば良いだけ。
Dagger2はコンパイル時に依存性が注入されるので、コンパイルされるまでは DaggerSampleApplication_SampleApplicationComponent に警告が表示されますが、それは気にしない。
通常
SampleComponent component =
DaggerSampleApplication_SampleApplicationComponent
.builder()
.sampleModule(new SampleModule())
.build();
依存性注入
SampleComponent component =
DaggerSampleApplication_SampleApplicationComponent
.builder()
.sampleModule(new SampleTestModule())
.build();
トラブルシューティング
以下の2点、気をつける必要があった。
compileOptionの追加
Gradleプロジェクトでは以下を追加しましょう。
packagingOptions {
exclude 'META-INF/services/javax.annotation.processing.Processor'
}
annotationライブラリの追加
Gradleプロジェクトでは以下を追加しましょう。
compile 'javax.annotation:jsr250-api:1.0'
ref: http://stackoverflow.com/questions/25090570/google-auto-factory-not-annotated-with-provided
その他
終わったあとに見てみたのだが、以下記事も参考になりそう。
ButterKifeとDagger2は触って感覚を覚えたので、今度はRoboGuiceかな。
testotips.ioで、依存性を持つところのテストTipsとか共有したい機運だ。