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
spek
Search
Shinnosuke Kugimiya
November 21, 2017
Programming
590
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
spek
spek
Shinnosuke Kugimiya
November 21, 2017
More Decks by Shinnosuke Kugimiya
See All by Shinnosuke Kugimiya
Claude Code x Androidアプリ 開発
kgmyshin
1
2.6k
AndroidアプリエンジニアもMCPを触ろう
kgmyshin
2
1.4k
15分で分かった気になる dumpsys
kgmyshin
1
370
UIテストはもうMaestroでいいのかもしれない話
kgmyshin
28
13k
新規開発を始めるときにやるべきこと
kgmyshin
19
9.3k
android app error handling
kgmyshin
1
1.6k
solid+cqs+dry
kgmyshin
35
10k
Paging Library ~ アイテムの更新 ~
kgmyshin
2
3.5k
KotlinでReact Native(expo) を使いたい
kgmyshin
2
1.2k
Other Decks in Programming
See All in Programming
Claude Code全社展開のためにやったことn選~プラグイン302個・コミッター271人を支えるために~
kenchan
5
1.5k
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
210
Go 1.27 における memory allocation の高速化
andpad
0
150
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
160
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
180
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
1
1.6k
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
590
プロポーザルを書いてもらう
pvcresin
0
310
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
260
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
270
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
4.2k
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
490
Featured
See All Featured
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
530
The Limits of Empathy - UXLibs8
cassininazir
1
600
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
66
57k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
WCS-LA-2024
lcolladotor
0
790
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
210
Rails Girls Zürich Keynote
gr2m
96
14k
Abbi's Birthday
coloredviolet
3
9.3k
Embracing the Ebb and Flow
colly
88
5.1k
Docker and Python
trallard
47
4.1k
A designer walks into a library…
pauljervisheath
211
24k
Transcript
0JTJY4XJGU,PUMJO߹ಉษڧձ
ࣗݾհ w LHNZTIJO ఝٶ Ͱ͢ w "OESPJEΤϯδχΞͰ͢ w "OESPJEΤϯδχΞͰ͢ w
0JTJYͰٕज़ΞυόΠβʔతͳ͜ͱ ͯ͠·͢
4QFLͱ
ίʔυྫ͔Β
·ͣ௨ৗͷςετΛ ݟͯΈΔ
@Test fun onCreateView() { val workId = WorkId(RandomHelper.randomString()) val work
= DomainHelper.work() val episodes = listOf( DomainHelper.episode(), DomainHelper.episode(), DomainHelper.episode() ) Mockito.`when`(workUseCase.execute(workId)).thenReturn(Maybe.just(work)) Mockito.`when`(episodeListUseCase.execute(workId)).thenReturn(Single.just(episodes)) val presenter = WorkDetailPresenter( getWorkUseCase, getEpisodeListUseCase, Schedulers.trampoline(), errorHandler ) presenter.setUp( view, screenTransition, workId.value ) presenter.onCreateView() val expectedViewModel = WorkDetailViewModelConverter.convertToViewModel( work, episodes ) Mockito.verify(view).setUp(expectedViewModel) }
@Test fun onCreateView() { val workId = WorkId(RandomHelper.randomString()) val work
= DomainHelper.work() val episodes = listOf( DomainHelper.episode(), DomainHelper.episode(), DomainHelper.episode() ) Mockito.`when`(workUseCase.execute(workId)).thenReturn(Maybe.just(work)) Mockito.`when`(episodeListUseCase.execute(workId)).thenReturn(Single.just(episodes)) val presenter = WorkDetailPresenter( getWorkUseCase, getEpisodeListUseCase, Schedulers.trampoline(), errorHandler ) presenter.setUp( view, screenTransition, workId.value ) presenter.onCreateView() val expectedViewModel = WorkDetailViewModelConverter.convertToViewModel( work, episodes ) Mockito.verify(view).setUp(expectedViewModel) } ςετͱͯ͠ͳ͍͕ɺ Կ͕ࣄલ݅Ͱ ԿΛͨ࣌͠ʹ ԿΛอূ͢Δςετͳͷ͔ ͺͬͱݟΘ͔Βͳ͍
@Test fun onCreateView() { val workId = WorkId(RandomHelper.randomString()) val work
= DomainHelper.work() val episodes = listOf( DomainHelper.episode(), DomainHelper.episode(), DomainHelper.episode() ) Mockito.`when`(workUseCase.execute(workId)).thenReturn(Maybe.just(work)) Mockito.`when`(episodeListUseCase.execute(workId)).thenReturn(Single.just(episodes)) val presenter = WorkDetailPresenter( getWorkUseCase, getEpisodeListUseCase, Schedulers.trampoline(), errorHandler ) presenter.setUp( view, screenTransition, workId.value ) presenter.onCreateView() val expectedViewModel = WorkDetailViewModelConverter.convertToViewModel( work, episodes ) Mockito.verify(view).setUp(expectedViewModel) } ࣄલ݅
@Test fun onCreateView() { val workId = WorkId(RandomHelper.randomString()) val work
= DomainHelper.work() val episodes = listOf( DomainHelper.episode(), DomainHelper.episode(), DomainHelper.episode() ) Mockito.`when`(workUseCase.execute(workId)).thenReturn(Maybe.just(work)) Mockito.`when`(episodeListUseCase.execute(workId)).thenReturn(Single.just(episodes)) val presenter = WorkDetailPresenter( getWorkUseCase, getEpisodeListUseCase, Schedulers.trampoline(), errorHandler ) presenter.setUp( view, screenTransition, workId.value ) presenter.onCreateView() val expectedViewModel = WorkDetailViewModelConverter.convertToViewModel( work, episodes ) Mockito.verify(view).setUp(expectedViewModel) } QSFTFOUFSͷPO$SFBUF7JFX͕ݺΕͨ࣌ʹ
@Test fun onCreateView() { val workId = WorkId(RandomHelper.randomString()) val work
= DomainHelper.work() val episodes = listOf( DomainHelper.episode(), DomainHelper.episode(), DomainHelper.episode() ) Mockito.`when`(workUseCase.execute(workId)).thenReturn(Maybe.just(work)) Mockito.`when`(episodeListUseCase.execute(workId)).thenReturn(Single.just(episodes)) val presenter = WorkDetailPresenter( getWorkUseCase, getEpisodeListUseCase, Schedulers.trampoline(), errorHandler ) presenter.setUp( view, screenTransition, workId.value ) presenter.onCreateView() val expectedViewModel = WorkDetailViewModelConverter.convertToViewModel( work, episodes ) Mockito.verify(view).setUp(expectedViewModel) } WJFXTFU6Q 7JFX.PEFM ͕ݺΕΔ͜ͱΛ͔֬ΊΔςετ
@Test fun onCreateView() { val workId = WorkId(RandomHelper.randomString()) val work
= DomainHelper.work() val episodes = listOf( DomainHelper.episode(), DomainHelper.episode(), DomainHelper.episode() ) Mockito.`when`(workUseCase.execute(workId)).thenReturn(Maybe.just(work)) Mockito.`when`(episodeListUseCase.execute(workId)).thenReturn(Single.just(episodes)) val presenter = WorkDetailPresenter( getWorkUseCase, getEpisodeListUseCase, Schedulers.trampoline(), errorHandler ) presenter.setUp( view, screenTransition, workId.value ) presenter.onCreateView() val expectedViewModel = WorkDetailViewModelConverter.convertToViewModel( work, episodes ) Mockito.verify(view).setUp(expectedViewModel) } WJFXTFU6Q 7JFX.PEFM ͕ݺΕΔ͜ͱΛ͔֬ΊΔςετ ͜ͷΑ͏ʹॱংΛపఈ͢Δ͜ͱ ͦ͏͍͏ॱংͰ͋Δ͜ͱΛ͍ͬͯΔ͜ͱͰ Θ͔Γ͘͢ͳΔ͕ Ͱ͖Δ͜ͱͳΒڧ੍తͩͬͨΓΫϥεͷߏͰ දݱ͍ͨ͠
4QFLͰॻ͍ͨ ςετΛΈΔ
given("WorkUseCase return work and EpisodeListUseCase return episodes") { val work
= DomainHelper.work() val episodes = listOf( DomainHelper.episode(), DomainHelper.episode(), DomainHelper.episode() ) Mockito.`when`(workUseCase.execute(workId)).thenReturn(Maybe.just(work)) Mockito.`when`(episodeListUseCase.execute(workId)).thenReturn(Single.just(episodes)) on("onCreateView") { presenter.onCreateView() it("should setUp ViewModel to view") { val expected = WorkDetailViewModelConverter.convertToViewModel( work, episodeList ) Mockito.verify(view).setUp(expected) } } }
given("WorkUseCase return work and EpisodeListUseCase return episodes") { val work
= DomainHelper.work() val episodes = listOf( DomainHelper.episode(), DomainHelper.episode(), DomainHelper.episode() ) Mockito.`when`(workUseCase.execute(workId)).thenReturn(Maybe.just(work)) Mockito.`when`(episodeListUseCase.execute(workId)).thenReturn(Single.just(episodes)) on("onCreateView") { subject.onCreateView() it("should setUp ViewModel to view") { val expected = WorkDetailViewModelConverter.convertToViewModel( work, episodeList ) Mockito.verify(view).setUp(expected) } } } Կ͕ࣄલ݅Ͱ ԿΛͨ࣌͠ʹ ԿΛอূ͢Δςετͳͷ͔ ͺͬͱݟͰΘ͔Δ
given("WorkUseCase return work and EpisodeListUseCase return episodes") { val work
= DomainHelper.work() val episodes = listOf( DomainHelper.episode(), DomainHelper.episode(), DomainHelper.episode() ) Mockito.`when`(workUseCase.execute(workId)).thenReturn(Maybe.just(work)) Mockito.`when`(episodeListUseCase.execute(workId)).thenReturn(Single.just(episodes)) on("onCreateView") { presenter.onCreateView() it("should setUp ViewModel to view") { val expected = WorkDetailViewModelConverter.convertToViewModel( work, episodeList ) Mockito.verify(view).setUp(expected) } } } ࣄલ݅
given("WorkUseCase return work and EpisodeListUseCase return episodes") { val work
= DomainHelper.work() val episodes = listOf( DomainHelper.episode(), DomainHelper.episode(), DomainHelper.episode() ) Mockito.`when`(workUseCase.execute(workId)).thenReturn(Maybe.just(work)) Mockito.`when`(episodeListUseCase.execute(workId)).thenReturn(Single.just(episodes)) on("onCreateView") { presenter.onCreateView() it("should setUp ViewModel to view") { val expected = WorkDetailViewModelConverter.convertToViewModel( work, episodeList ) Mockito.verify(view).setUp(expected) } } } QSFTFOUFSͷPO$SFBUF7JFX͕ݺΕͨ࣌ʹ
given("WorkUseCase return work and EpisodeListUseCase return episodes") { val work
= DomainHelper.work() val episodes = listOf( DomainHelper.episode(), DomainHelper.episode(), DomainHelper.episode() ) Mockito.`when`(workUseCase.execute(workId)).thenReturn(Maybe.just(work)) Mockito.`when`(episodeListUseCase.execute(workId)).thenReturn(Single.just(episodes)) on("onCreateView") { presenter.onCreateView() it("should setUp ViewModel to view") { val expected = WorkDetailViewModelConverter.convertToViewModel( work, episodeList ) Mockito.verify(view).setUp(expected) } } } WJFXTFU6Q 7JFX.PEFM ͕ݺΕΔ͜ͱΛ͔֬ΊΔςετ
given("WorkUseCase return work and EpisodeListUseCase return episodes") { val work
= DomainHelper.work() val episodes = listOf( DomainHelper.episode(), DomainHelper.episode(), DomainHelper.episode() ) Mockito.`when`(workUseCase.execute(workId)).thenReturn(Maybe.just(work)) Mockito.`when`(episodeListUseCase.execute(workId)).thenReturn(Single.just(episodes)) on("onCreateView") { presenter.onCreateView() it("should setUp ViewModel to view") { val expected = WorkDetailViewModelConverter.convertToViewModel( work, episodeList ) Mockito.verify(view).setUp(expected) } } } WJFXTFU6Q 7JFX.PEFM ͕ݺΕΔ͜ͱΛ͔֬ΊΔςετ Θ͔Δ
4QFLͷࢥ
4QFL w 6OJU5FTUڀۃతʹ༷ͩ w ͋Δঢ়گͰ͋Δ͜ͱΛͨ͠Β͋ΔৼΔ͍Λ͢Δ w ͭ·Γɺ4QFL༷ϑϨʔϜϫʔΫͩ
"OESPJEͷಋೖ
buildscript { repositories { maven { url "http://dl.bintray.com/jetbrains/spek" } }
} 5PQMFWFMCVJMEHSBEMF
dependencies { : testImplementation "org.jetbrains.spek:spek-api:$kotlin_version" testImplementation "org.jetbrains.spek:spek-junit-platform-engine: $kotlin_version" testImplementation "org.jetbrains.spek:spek-subject-extension:
$kotlin_version" // option testImplementation "org.junit.platform:junit-platform-runner:1.0.0" } .PEVMFMFWFMCVJMEHSBEMF
͍ํ
@RunWith(JUnitPlatform::class) class BeforeSeasonWorkListPresenterTest : Spek({ val getBeforeSeasonWorkListUseCase = Mockito.mock(GetBeforeSeasonWorkListUseCase::class.jav given("GetBeforeSeasonWorkListUseCase
return workList") { val works = DomainHelper. works() Mockito.`when`(getBeforeSeasonWorkListUseCase.execute()).thenReturn(Single.just(works)) on("onCreateView") { val presenter = BeforeSeasonWorkListPresenter(getBeforeSeasonWorkListUseCase) presenter.onCreateView() it("should setUp ViewModel to view") { val expected = WorkViewModelConverter.convertToViewModel(works) Mockito.verify(view).setUp(expected) } } } given("") { on("onClickWork") { val viewModel = WorkViewModelFactory.create() val presenter = BeforeSeasonWorkListPresenter(getBeforeSeasonWorkListUseCase) presenter.onClickWork(viewModel) it("should move to Detail") { Mockito.verify(screenTransition).moveToDetail() } } } })
@RunWith(JUnitPlatform::class) class BeforeSeasonWorkListPresenterTest : Spek({ val getBeforeSeasonWorkListUseCase = Mockito.mock(GetBeforeSeasonWorkListUseCase::class.jav given("GetBeforeSeasonWorkListUseCase
return workList") { val works = DomainHelper. works() Mockito.`when`(getBeforeSeasonWorkListUseCase.execute()).thenReturn(Single.just(works)) on("onCreateView") { val presenter = BeforeSeasonWorkListPresenter(getBeforeSeasonWorkListUseCase) presenter.onCreateView() it("should setUp ViewModel to view") { val expected = WorkViewModelConverter.convertToViewModel(works) Mockito.verify(view).setUp(expected) } } } given("") { on("onClickWork") { val viewModel = WorkViewModelFactory.create() val presenter = BeforeSeasonWorkListPresenter(getBeforeSeasonWorkListUseCase) presenter.onClickWork(viewModel) it("should move to Detail") { Mockito.verify(screenTransition).moveToDetail() } } } }) HJWFO PO JUΛͬͯςετΛॻ͚ͩ͘
4VCKFDU4QFL
@RunWith(JUnitPlatform::class) internal class BeforeSeasonWorkListPresenterSpec : SubjectSpek<BeforeSeasonWorkListPresenter>({ val getBeforeSeasonWorkListUseCase = Mockito.mock(GetBeforeSeasonWorkListUseCase::class.java)
subject { BeforeSeasonWorkListPresenter(getBeforeSeasonWorkListUseCase) } given("GetBeforeSeasonWorkListUseCase return workList") { val works = DomainHelper.works() Mockito.`when`(getBeforeSeasonWorkListUseCase.execute()).thenReturn(Single.just(works)) on("onCreateView") { subject.onCreateView() it("should setUp ViewModel to view") { val expected = WorkViewModelConverter.convertToViewModel(works) Mockito.verify(view).setUp(expected) } } } given("") { on("onClickWork") { val viewModel = WorkViewModelFactory.create() subject.onClickWork(viewModel) it("should move to Detail") { Mockito.verify(screenTransition).moveToDetail() } } } })
@RunWith(JUnitPlatform::class) internal class BeforeSeasonWorkListPresenterSpec : SubjectSpek<BeforeSeasonWorkListPresenter>({ val getBeforeSeasonWorkListUseCase = Mockito.mock(GetBeforeSeasonWorkListUseCase::class.java)
subject { BeforeSeasonWorkListPresenter(getBeforeSeasonWorkListUseCase) } given("GetBeforeSeasonWorkListUseCase return workList") { val works = DomainHelper.works() Mockito.`when`(getBeforeSeasonWorkListUseCase.execute()).thenReturn(Single.just(works)) on("onCreateView") { subject.onCreateView() it("should setUp ViewModel to view") { val expected = WorkViewModelConverter.convertToViewModel(works) Mockito.verify(view).setUp(expected) } } } given("") { on("onClickWork") { val viewModel = WorkViewModelFactory.create() subject.onClickWork(viewModel) it("should move to Detail") { Mockito.verify(screenTransition).moveToDetail() } } } }) ςετରΫϥε͕Θ͔Γ͍͢
ଞʹ w HJWFOPOJU͚ͩͰͳ͘EFTDSJCFJUͷܗͰॻ͚ Δ w CFGPSF(SPVQ BGUFS&BDI5FTUͳͲϑοΫͰ͖Δ w NFNPJ[FEͰॻ͘ςετͷͨͼʹ࡞Γͨ͠ΓͰ ͖Δ
w YQSFpYΛ͚ͭΕQFOEJOHʹͰ͖Δ YHJWFO YJUͳ Ͳ
Ҿ͔͔ͬͬͨΓͨ͠ͱ ͜Ζ
Ҿ͔͔ͬͬͨΓͨ͠ͱ͜Ζᶃ w !3VO8JUI +6OJU1MBUGPSNDMBTT Λ͚ͭͳ͍ͱೝ ࣝ͞Εͳ͍ w UFTUΛΒͤͨͱ͖ʹɺGBJM͞ΕΔͣͷςετ ͕GBJM͠ͳ͍ͷͰؾ͔ͮͳ͍Մೳੑ͕͋Δ ˞+6OJUͳΒ͚ͭͳ͍͍ͯ͘
Έ͍ͨ
Ҿ͔͔ͬͬͨΓͨ͠ͱ͜Ζᶄ ύοέʔδใ͕ফ͑Δʜ
Ҿ͔͔ͬͬͨΓͨ͠ͱ͜Ζᶄ Ͳͷςετ͔Θ͔ΓͮΒ͍
Ҿ͔͔ͬͬͨΓͨ͠ͱ͜Ζᶅ Spek { val a: A = Mockito.mock(A::class.java) given() {
Mockito.when(a.execute).thenReturn("a") on() { it() { assertEquals("a", a.execute) } } } } ͜ͷςετ1BTT 'BJM
Ҿ͔͔ͬͬͨΓͨ͠ͱ͜Ζᶅ Spek { val a: A = Mockito.mock(A::class.java) given() {
Mockito.when(a.execute).thenReturn("a") on() { it() { assertEquals("a", a.execute) } } } } 1BTT
Spek { val a: A = Mockito.mock(A::class.java) given() { Mockito.when(a.execute).thenReturn("a")
on() { it() { assertEquals("a", a.execute) } } } given() { Mockito.when(a.execute).thenReturn("b") on() { it() { assertEquals("b", a.execute) } } } } ͜ͷςετ1BTT 'BJM
Spek { val a: A = Mockito.mock(A::class.java) given() { Mockito.when(a.execute).thenReturn("a")
on() { it() { assertEquals("a", a.execute) } } } given() { Mockito.when(a.execute).thenReturn("b") on() { it() { assertEquals("b", a.execute) } } } }
Spek { val a: A = Mockito.mock(A::class.java) given() { Mockito.when(a.execute).thenReturn("a")
on() { it() { assertEquals("a", a.execute) } } } given() { Mockito.when(a.execute).thenReturn("b") on() { it() { assertEquals("b", a.execute) } } } } 1BTT 'BJM
Spek { val a: A = Mockito.mock(A::class.java) given() { Mockito.when(a.execute).thenReturn("a")
on() { it() { assertEquals("a", a.execute) } } } given() { Mockito.when(a.execute).thenReturn("b") on() { it() { assertEquals("b", a.execute) } } } } ͬͱԼʹ͋Δͷউͪ
Spek { val a: A = Mockito.mock(A::class.java) given() { beforeGroup
{ Mockito.when(a.execute).thenReturn(“a”) } on() { it() { assertEquals("a", a.execute) } } } given() { beforeGroup { Mockito.when(a.execute).thenReturn(“b”) } on() { it() { assertEquals("b", a.execute) } } } ͜͏͠·͠ΐ͏
·ͱΊ
·ͱΊ w Ϣχοτςετͱ͢ͳΘ༷ͪͩʂ w 4QFL༷ϑϨʔϜϫʔΫͩʂ w HJWFOPOJUͰςετΛॻ͜͏ w 4VCKFDU4QFLͰςετରΛ໌֬ʹ w
ͪΖΜσϝϦοτ͋Δ
࣮ࡍʹͬͯΔ༷Λ ݟ͍ͨํͪ͜Β͔Β w IUUQTHJUIVCDPNLHNZTIJOBOOJDUBOESPJE