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
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
120
Other Decks in Technology
See All in Technology
作りっぱなしで終わらせない! 価値を出し続ける AI エージェントのための「信頼性」設計 / Designing Reliability for AI Agents that Deliver Continuous Value
aoto
PRO
1
200
マルチロールEMが実践する「組織のレジリエンス」を高めるための組織構造と人材配置戦略
coconala_engineer
3
590
Claude Codeの進化と各機能の活かし方
oikon48
18
8.3k
元エンジニアPdM、IDEが恋しすぎてCursorに全業務を集約したら、スライド作成まで爆速になった話
doiko123
1
450
マネージャー版 "提案のレベル" を上げる
konifar
21
13k
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.4k
LINE Messengerの次世代ストレージ選定
lycorptech_jp
PRO
19
7.5k
OpenClawで回す組織運営
jacopen
3
620
IBM Bobを使って、PostgreSQLのToDoアプリをDb2へ変換してみよう/202603_Dojo_Bob
mayumihirano
0
200
Exadata Database Service on Dedicated Infrastructure(ExaDB-D) UI スクリーン・キャプチャ集
oracle4engineer
PRO
8
7.1k
AWS DevOps Agent vs SRE俺 / AWS DevOps Agent vs me, the SRE
sms_tech
3
330
kintone開発のプラットフォームエンジニアの紹介
cybozuinsideout
PRO
0
840
Featured
See All Featured
Java REST API Framework Comparison - PWX 2021
mraible
34
9.2k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
Evolving SEO for Evolving Search Engines
ryanjones
0
150
Navigating Team Friction
lara
192
16k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
140
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.4k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
400
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
130
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
Mobile First: as difficult as doing things right
swwweet
225
10k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.4k
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