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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Shun Hosaka
October 04, 2017
Technology
680
1
Share
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.5k
なぜ変更を検知できるDBが必要なのか
reyurnible
1
140
RxDownloader
reyurnible
0
120
Other Decks in Technology
See All in Technology
Anthropic AIネイティブ・スタートアップ構築のプレイブック を理解する
nagatsu
0
110
ANDPAD Ruby sponsor session in RubyKaigi 2026
andpad
0
150
Python開発環境にハーネス適用を検討する
yuuka51
1
480
自作エディターをOSSにして分かった、一人に刺さる開発が世界を動かす理由
shinyasaita
1
290
コーポレートサイトのアクセシビリティ改善とJIS準拠への実践
lycorptech_jp
PRO
2
130
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
4.5k
Amazon Bedrock で生成AI活用サービスをセキュアに構築する方法
takanorig
1
110
TypeScriptで実現する既存APIを活用したリモートMCPサーバー構築 / TSKaigi 2026
soarteclab
1
270
TypeScriptエンジニアのためのWASMランタイム入門:AssemblyScriptから理解するメモリの実態(ayano)
ayanoyuki
0
120
LLM時代のリファクタリング戦略_AIエージェントによる段階的・安全なTS移行方法
play_inc
0
170
データ分析基盤の信頼を支える視点と設計
yuki_saito
1
610
TSKaigi 2026 - 型プラグインシステムの実装に使われるテクニック
teamlab
PRO
2
310
Featured
See All Featured
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
810
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.9k
Done Done
chrislema
186
16k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.8k
The Spectacular Lies of Maps
axbom
PRO
1
760
YesSQL, Process and Tooling at Scale
rocio
174
15k
Tell your own story through comics
letsgokoyo
1
930
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
150
Believing is Seeing
oripsolob
1
130
The Mindset for Success: Future Career Progression
greggifford
PRO
0
340
Joys of Absence: A Defence of Solitary Play
codingconduct
1
370
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