Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kotlin + Kodein Test Data Mocking

Shun Hosaka
October 04, 2017

Kotlin + Kodein Test Data Mocking

Kotlin Test data mocking using to Kodelin.

Shun Hosaka

October 04, 2017
Tweet

More Decks by Shun Hosaka

Other Decks in Technology

Transcript

  1. ͸͡Ίʹ w อࡔॣ ΄͔͞͠ΎΜ  w ৽ଔ̍೥໨ɺ,PUMJOྺ̏೥໨ w (JU)VC 2JJUBͳͲ3FZVSOJCMF

    w ΩοζϦʔͱ͍͏ϓϩμΫτͷ10݉ΤϯδχΞ
 ʢอҭԂ޲͚ͷαʔϏεʣ 2
  2. ,PEFJOجຊతͳ࢖͍ํ 7 ,PEFJOΠϯελϯεΛ࡞ΓɺͦͷϒϩοΫ಺ͰΠϯδΣΫτ͍ͨ͠ΦϒδΣΫτΛCJOE͢Δɻ ͋ͱ͸ɺड͚औΓ͍ͨଆͰ,PEFJOͷΠϯελϯε͔ΒCJOE͞Εͨ΋ͷΛड͚औΔ // Materials class Bean // Coffee

    abstract class Coffee(val bean: Bean) class BlackCoffee(bean: Bean) : Coffee(bean) val kodein = Kodein { bind<Bean>() with provider { Bean() } bind<Coffee>() with provider { BlackCoffee(instance()) } } // ܕ͔ΒmoduleͷதͰద౰ͳ΋ͷΛΠϯδΣΫτͯ͘͠ΕΔ val coffee: Coffee = kodein.instance()
  3. ,PEFJOͦͷଞͷ࢖͍ํ 8 %BHHFSͳͲͱಉ༷ʹෳ਺ͷΠϯελϯεͷੜ੒ํ๏͕,PEFJOʹ͸༻ҙ͞Ε͍ͯ·͢ɻ // Materials data class Bean(val farm: String)

    class Sugar val kodein = Kodein { // γϯάϧτϯ bind<Sugar>() with singleton { Sugar() } // ఆ਺ constant("Farm") with "ίϩϯϏΞ" // λά෇͖ bind<Bean>("ίϩϯϏΞ") with provider { Bean("ίϩϯϏΞ") } // Ҿ਺͋Γ bind<Bean>() with factory { farm: String -> Bean(farm) } }
  4. ,PEFJONPEVMFԽ 9 val beanModule = Kodein.module { constant("Farm") with "ίϩϯϏΞ"

    bind<Bean>() with provider { Bean(instance("Farm")) } } val potModule = Kodein.module { bind<Milk>() with provider { Milk() } bind<Sugar>() with provider { Sugar() } } class CafeAuLait( bean: Bean, val sugar: Sugar?, val milk: Milk ) : Coffee(bean) val kodein: Kodein = Kodein { import(beanModule, allowOverride = true) import(potModule) 
 bind<Bean>(overrides = true) with provider { Bean("ΤνΦϐΞ") } bind<Coffee>() with provider { CafeAuLait(instance(), instance(), instance()) } }
  5. ςετσʔλͷΠϯδΣΫγϣϯ 12 ςετσʔλΛ͜Μͳײ͡ʹΠϯδΣΫτ͠·͢ɻ val factory: Kodein = Kodein { import(errorFactory)

    import(articleFactory) import(articleSourceFactory) } @Test fun testOnCreateSuccess() = given { val responseFactory: (Int) -> List<ArticleSource> = factory.instance() val response = responseFactory(10) Want(Single.just(response)).When(newsRepository).getSources() it.onCreate() val testObserver = sceneDataHolder.sourceList.asObservable().test() testObserver.awaitTerminalEvent() testObserver .assertNoErrors() .assertValue { it == response } }
  6. 'BDUPSZଆϞοΫ 13 /** * Create Article */ val articleFactory =

    Kodein.Module { bind<Date>("now") with provider { Date() } bind<List<Article>>() with factory { size: Int -> (0 until size).map { instance<Article>() } } bind<Article>() with provider { Article( title = "Samsung tried to spin the Note 7 disaster", description = "From time to time, Samsung strikes...", author = "Brian Heater", url = "https://example.com/2017/08/24/", urlToImage = "https://example.com/image.png", publishedAt = instance("now") ) } } ࣌ؒͳͲɺPWFSSJEFͰ͖ΔΑ͏ʹ͓ͯ͘͠
  7. 'BDUPSZଆFSSPSͷྫ 14 /** * Api Error Factory */ val errorFactory

    = Kodein.Module { // Domain Error(εςʔλείʔυʹԠͨ͡ΤϥʔΛฦͨ͠Γ) bind<DomainError.Api>() with factory { statusCode: Int -> DomainError.Api(statusCode) } bind<DomainError.Network>() with provider { DomainError.Network } bind<DomainError.Unknown>() with provider { DomainError.Unknown(RuntimeException("mocked exception.")) } // Retrofit Api Error bind<HttpException>("UnAuthorized") with provider { HttpException(Response.error<Any>(401, Mockito.mock(ResponseBody::class.java))) } bind<HttpException>("NotFound") with provider { HttpException(Response.error<Any>(404, Mockito.mock(ResponseBody::class.java))) } }