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

Kotlin + Kodein Test Data Mocking

Avatar for Shun Hosaka Shun Hosaka
October 04, 2017

Kotlin + Kodein Test Data Mocking

Kotlin Test data mocking using to Kodelin.

Avatar for Shun Hosaka

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))) } }