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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Shun Hosaka
October 04, 2017
Technology
1
670
Kotlin + Kodein Test Data Mocking
Kotlin Test data mocking using to Kodelin.
Shun Hosaka
October 04, 2017
Tweet
Share
More Decks by Shun Hosaka
See All by Shun Hosaka
Android Goodbye `shape`
reyurnible
0
430
独自設計のAndroidアプリを設計ごとKotlinizeした話
reyurnible
1
1.5k
なぜ変更を検知できるDBが必要なのか
reyurnible
1
140
RxDownloader
reyurnible
0
110
Other Decks in Technology
See All in Technology
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
3k
CDKで始めるTypeScript開発のススメ
tsukuboshi
1
440
Introduction to Bill One Development Engineer
sansan33
PRO
0
360
日本の85%が使う公共SaaSは、どう育ったのか
taketakekaho
1
210
ZOZOにおけるAI活用の現在 ~開発組織全体での取り組みと試行錯誤~
zozotech
PRO
5
5.6k
[CV勉強会@関東 World Model 読み会] Orbis: Overcoming Challenges of Long-Horizon Prediction in Driving World Models (Mousakhan+, NeurIPS 2025)
abemii
0
140
20260204_Midosuji_Tech
takuyay0ne
1
160
ブロックテーマでサイトをリニューアルした話 / 2026-01-31 Kansai WordPress Meetup
torounit
0
470
予期せぬコストの急増を障害のように扱う――「コスト版ポストモーテム」の導入とその後の改善
muziyoshiz
1
1.9k
M&A 後の統合をどう進めるか ─ ナレッジワーク × Poetics が実践した組織とシステムの融合
kworkdev
PRO
1
450
GitHub Issue Templates + Coding Agentで簡単みんなでIaC/Easy IaC for Everyone with GitHub Issue Templates + Coding Agent
aeonpeople
1
230
SREチームをどう作り、どう育てるか ― Findy横断SREのマネジメント
rvirus0817
0
270
Featured
See All Featured
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
180
Game over? The fight for quality and originality in the time of robots
wayneb77
1
120
[SF Ruby Conf 2025] Rails X
palkan
1
750
Navigating Weather and Climate Data
rabernat
0
110
Building an army of robots
kneath
306
46k
Testing 201, or: Great Expectations
jmmastey
46
8k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
1.8k
The Pragmatic Product Professional
lauravandoore
37
7.1k
We Have a Design System, Now What?
morganepeng
54
8k
Tell your own story through comics
letsgokoyo
1
810
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
320
Making Projects Easy
brettharned
120
6.6k
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