kotlinとDIについて-1
一回で書ききれる気がしないDIについて
まずDIとは
DependencyInjectionの略で
デザインパターンの一種です。
例えば以下のController#doSomethingのテストをしたい場合
APIClientの実装に依存してしまうため
本来行いたいControllerのテストが困難になってくる。
class APIClient {
//apiからDataを取ってくる
fun fetchData*1 : Single<Data>
}
class Controller {
val client = APIClient()
fun doSomething(){
//clientの実装は正しい?
client.fetchData(
this::dataFetched,
this::dataFetchedError)
}
fun dataFetched(data:Data){
}
fun dataFechedError(error:Throwable){
}
}
そこでAPIClientを内部で作らず
外から持たせようというのがDI
//この辺がDI
class Controller(private val client:APIClient) {
fun doSomething(){
//clientの実装が正しくないと、正しく動かない!
client.fetchData(
this::dataFetched,
this::dataFetchedError)
}
こうすると、どのAPIClientを使うかを
Controller生成時に制御できるので
テストがしやすくなる。
何故テストしやすくなるかというと、
apiClientがモック化できるようになるから。
val apiMock = object : APIClient() {
override fun dataFetched(callback:*2{
//mockでcallbackを返す
callback(Data())
}
}
val controller = Controller(apiMock)
controller.doSomething()
//dataFetchedがコールされる
今日はここまで。
コード適当すぎるのでちゃんとブログでもテストコード書かないとアカン\(^o^)/
[所要時間:20分]