Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kotlin + Kodein Test Data Mocking
Search
Shun Hosaka
October 04, 2017
Technology
680
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Kotlin + Kodein Test Data Mocking
Kotlin Test data mocking using to Kodelin.
Shun Hosaka
October 04, 2017
More Decks by Shun Hosaka
See All by Shun Hosaka
Android Goodbye `shape`
reyurnible
0
450
独自設計のAndroidアプリを設計ごとKotlinizeした話
reyurnible
1
1.6k
なぜ変更を検知できるDBが必要なのか
reyurnible
1
150
RxDownloader
reyurnible
0
140
Other Decks in Technology
See All in Technology
[RSJ26] NarrativeFlow: Flow-Based Vision-Language-Action Model Using Robot Velocity Fields
keio_smilab
PRO
0
150
PM領域でのAI Agentの活用
lycorptech_jp
PRO
0
270
AI 駆動 Terraform 開発/SRE_BizReach_MIXI_2
visional_engineering_and_design
0
230
Bet AI Day 2026丨AIを「使う」から、AIが「働く」へ ― LayerXが進める「組織AI」の社会実装
layerx
PRO
2
2.2k
Autonomous AI Databaseサービス・アップデート(FY27)/ adb-service-update-jp-fy27
oracle4engineer
PRO
0
110
KPIだけでは評価できないプロダクトが考えるべき Evalsという第二の評価系 / Beyond KPIs: Evals as a Second Evaluation Framework for Products #PdEConf
aki_iinuma
4
3.6k
enechainの内製セルフサービスプラットフォーム
hiyosi
0
110
#jawssonic2026 あの時代が悪かった ~動かなかったSageMakerと共に迎えたイベント当日~
ktkn1129
0
130
Genie Code ワークショップ 基礎編 / Genie-Code-Workshop-fundamental
databricksjapan
PRO
0
350
Bet AI Day 2026丨Production-Ready AI Agents — エンタープライズの実務を任せるための設計と運用
layerx
PRO
3
2.1k
DINO-EdgeQuery:Edge-First Polygon Decoding for Building Footprint Extraction from Satellite Imagery
lehupa
0
140
DGX Sparkを2台使って いろいろ動かす話
sonoda_mj
1
130
Featured
See All Featured
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
660
sira's awesome portfolio website redesign presentation
elsirapls
0
400
Unsuck your backbone
ammeep
672
58k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
270
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Code Reviewing Like a Champion
maltzj
528
40k
We Are The Robots
honzajavorek
0
330
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
400
30 Presentation Tips
portentint
PRO
1
390
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
4
570
Transcript
KodeinΛͬͨςετσʔλ ΠϯδΣΫγϣϯ ϦΫϧʔτϚʔέςΟϯάύʔτφʔζ อࡔॣ 4IVO)PTBLB 1
͡Ίʹ w อࡔॣ ΄͔͞͠ΎΜ w ৽ଔ̍ɺ,PUMJOྺ̏ w (JU)VC 2JJUBͳͲ3FZVSOJCMF
w ΩοζϦʔͱ͍͏ϓϩμΫτͷ10݉ΤϯδχΞ ʢอҭԂ͚ͷαʔϏεʣ 2
ࠓͷ༰ w ,PUMJOͰͷ%*ͷ w ςετσʔλΛ͏·͍͜ͱѻ͏ʹతͳ w %*ΛΏΔ͘͡ΊΑ͏ͬͯ 3
ςετσʔλͷۤ w ಉ͡ϞσϧΛ৭ʑͳςετΫϥεͷதͰੜ ͍ͯ͠Δ w ͕͋ͪͪؔ͜ෳࡶʹͳΔ w ςετͷύλʔϯʹΑ໊ͬͯલΛ͚ͯ ཧ͕ͮ͠Β͍ 4
ʼςετσʔλΛ%*͢Ε͍͍ͷͰʁ
,PUMJOͰ%* w %BHHFS w ,PEFJO w 5PPUIQJDLT w (VJDF w
5 ˒
,PEFJO w %FMFHBUFTϓϩύςΟΛ༻ͨ͠७,PUMJOͷ%* ϥΠϒϥϦ w ˒ w υΩϡϝϯτॆ࣮ͯ͠Δ w IUUQTTBMPNPOCSZTHJUIVCJP,PEFJO
6 Painless Kotlin Dependency Injection
,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()
,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) } }
,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()) } }
,PEFJOར w ͏ͷ͕؆୯ w "15Ͱͳ͍ͷͰϏϧυ͕͘ͳΒͳ͍ w υΩϡϝϯτ͕๛ w GBDUPSZɺPWFSSJEFͳͲ͕Ͱ͖Δ w
$POUFYUͳͲͷΠϯδΣΫτ༻ʹɺ"OESPJE αϙʔτ͋Δ 10
ςετσʔλͷΠϯδΣΫγϣϯ 11 ,PEFJO .PEVMF ,PEFJO 5FTUDBTF
ςετσʔλͷΠϯδΣΫγϣϯ 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 } }
'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Ͱ͖ΔΑ͏ʹ͓ͯ͘͠
'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))) } }
ϙΠϯτ w ΦϒδΣΫτͷґଘؔΛ؆୯ʹѻ͑Δʂ w ,PEFJOΠϯελϯεͷ࡞ҐஔΛ͢Ε έʔε͝ͱͷPWFSSJEFͳͲͰ͖Δʂ w Ϋϥε͝ͱʹΦʔόʔϥΠυ͢ΔՄೳੑ͕͋Δ ͷɺϢʔβʔͳͲUBHͰ໊લΛ͚ΒΕΔ w
ઃఆ΄ͱΜͲඞཁͳ͍ͷͰɺUFTU͚ͩͰ͙͢ ʹѻ͑Δ 15
͍͞͝ʹ w ,PEFJOͰɺ·ͣ؆୯ʹ%*ʹ׳Ε·͠ΐ͏ʂ w ຊ൪Ͱͷ༻͕ා͍ͱ͍͏ਓ·ͣςετ Ͱܰ͘ೖΕͯΈ·͠ΐ͏ʂ 16
ιʔείʔυ 17 w ,PUMJO w ,PEFJO "OLP "OESPJE"SDIJUFDUVSF$PNQPOFOUT IUUQTHJUIVCDPN3FZVSOJCMFLPUMJOTBNQMFOFXTBQQ
1MFBTFKPJOUPNZUFBN 18