すわりんのブログ

androidとかサブカルとかのブログです

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分]

*1:data:Data) -> (),(thowable:Thowable) -> (

*2:data:Data) -> (