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
580
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.5k
AndroidアプリエンジニアもMCPを触ろう
kgmyshin
2
1.4k
15分で分かった気になる dumpsys
kgmyshin
1
360
UIテストはもうMaestroでいいのかもしれない話
kgmyshin
28
13k
新規開発を始めるときにやるべきこと
kgmyshin
19
9.2k
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
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
140
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.8k
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
140
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
970
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
4
1.6k
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
280
A2UI という光を覗いてみる
satohjohn
1
170
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
1k
symfony/aiとlaravel/boost
77web
0
110
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.7k
AIエージェントで 変わるAndroid開発環境
takahirom
1
160
Vite+ Unified Toolchain for the Web
naokihaba
0
410
Featured
See All Featured
Java REST API Framework Comparison - PWX 2021
mraible
34
9.4k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
Making the Leap to Tech Lead
cromwellryan
135
10k
Typedesign – Prime Four
hannesfritz
42
3.1k
GraphQLとの向き合い方2022年版
quramy
50
15k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.7k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
Scaling GitHub
holman
464
140k
Designing for humans not robots
tammielis
254
26k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.3k
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