DIとは
そこで登場するのが、依存性注入=DIという考え方です。これは、あるクラスで他のクラスのインスタンス生成を行う代わりに、自身のインスタンスが生成される際に、依存するはずのクラスのインスタンスを受け取る仕組みです。
つまり、依存先クラスインスタンスが、後から注入=Injectionされるのです。前項の例ならば、ViewModelのインスタンスが生成される際に、リポジトリインスタンスを受け取るようにします(図3)。
依存先インスタンスを後から受け取れるということは、実動作する場合と単体テストの場合、それぞれに別々のインスタンスを渡すことが可能となります。
例えば、ViewModelに対して、実動作する場合は、実動作用の(本物の)リポジトリクラスインスタンスを渡します。一方で、単体テストの場合は、本物のリポジトリクラスに似せて作った偽物のリポジトリクラスを渡します。本物のリポジトリクラスがRoomを利用してデータベースのデータを利用するように作られているとしたら、偽物の方は、実際にRoomを利用するのではなく、常に同じ結果を返す、つまりデータをハードコーディングしてメソッドを作成します。
こういったクラスを作成した上で、テスト時に利用することで、単体テストの精度が格段に向上します。こうした偽物のオブジェクトのことを、テストダブルといいます。
なお、本稿は、誌面の都合上、単体テストの実装方法までは紹介できません。ご了承ください。
Android用のDIライブラリであるHilt
こうしたDIの仕組みを独自に実装しようとすると、かなり骨が折れます。そこで、各言語、各アーキテクチャに合わせて、各種DIライブラリが提供されています。
そのうち、Androidでは、Hiltを利用します。Hiltは標準ではプロジェクトに含まれていないため、プロジェクトに依存ライブラリの設定を行う必要があります。
まず、build.gradle.kts(Project)ファイルのpluginsプロパティに、idを追加します。これは、Javaプロジェクトならばリスト1、Kotlinプロジェクトならばリスト2のコードとなります。なお、バージョン番号は、Hiltの原稿執筆時点での番号です。最新バージョン番号はDaggerのリポジトリで確認してください。実は、Hiltは、Googleが提供するDIライブラリDaggerを基盤としたライブラリとして提供されているのです。
plugins {
:
id("com.google.dagger.hilt.android") version "2.57.2" apply false
}
plugins {
:
id("com.google.dagger.hilt.android") version "2.57.2" apply false
id("com.google.devtools.ksp") version "2.0.21-1.0.27" apply false
}
[NOTE]KSP
build.gradle.kts(Project)への追記に関して、Kotlin版には、Java版にはない、kspプラグインがあります。このKSPは、Kotlin Symbol Processingの略です。Androidでは、JavaのアノテーションをKotlinでも利用できるようにしたツールとしてKAPT(Kotlin Annotation Processing Tool)というのがかつて利用されていましたが、このKAPTに代わるものとして現在利用されているのがKSPです。KSPは、KAPTに比べて高速で処理できるのが特徴です。
次に、build.gradle.kts(Module)ファイルのpluginsプロパティにidを、dependenciesに依存関係を追記します。これは、Javaプロジェクトならばリスト3、Kotlinプロジェクトならばリスト4のコードとなります。build.gradle.kts(Project)同様に、バージョン番号は、Hiltの原稿執筆時点での番号です。
plugins {
:
id("com.google.dagger.hilt.android")
}
android {
:
}
dependencies {
implementation("com.google.dagger:hilt-android:2.57.2")
annotationProcessor("com.google.dagger:hilt-android-compiler:2.57.2")
:
}
plugins {
:
id("com.google.devtools.ksp")
id("com.google.dagger.hilt.android")
}
android {
:
}
dependencies {
implementation("com.google.dagger:hilt-android:2.57.2")
ksp("com.google.dagger:hilt-android-compiler:2.57.2")
:
}
