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
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
We Built for Predictability; The Workloads Didn’t Care
stahnma
0
140
Introduction to Bill One Development Engineer
sansan33
PRO
0
360
What happened to RubyGems and what can we learn?
mikemcquaid
0
300
登壇駆動学習のすすめ — CfPのネタの見つけ方と書くときに意識していること
bicstone
3
110
2026年、サーバーレスの現在地 -「制約と戦う技術」から「当たり前の実行基盤」へ- /serverless2026
slsops
2
250
CDKで始めるTypeScript開発のススメ
tsukuboshi
1
460
[CV勉強会@関東 World Model 読み会] Orbis: Overcoming Challenges of Long-Horizon Prediction in Driving World Models (Mousakhan+, NeurIPS 2025)
abemii
0
140
SREのプラクティスを用いた3領域同時 マネジメントへの挑戦 〜SRE・情シス・セキュリティを統合した チーム運営術〜
coconala_engineer
2
660
Cosmos World Foundation Model Platform for Physical AI
takmin
0
920
OWASP Top 10:2025 リリースと 少しの日本語化にまつわる裏話
okdt
PRO
3
800
StrandsとNeptuneを使ってナレッジグラフを構築する
yakumo
1
120
ファインディの横断SREがTakumi byGMOと取り組む、セキュリティと開発スピードの両立
rvirus0817
1
1.4k
Featured
See All Featured
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
270
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.9k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
60
42k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.3k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Utilizing Notion as your number one productivity tool
mfonobong
3
220
Mobile First: as difficult as doing things right
swwweet
225
10k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
[SF Ruby Conf 2025] Rails X
palkan
1
760
Build your cross-platform service in a week with App Engine
jlugia
234
18k
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