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
Melhore Seus Testes em Kotlin com Mockk
Search
Angélica Oliveira
May 29, 2019
Programming
340
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Melhore Seus Testes em Kotlin com Mockk
Angélica Oliveira
May 29, 2019
More Decks by Angélica Oliveira
See All by Angélica Oliveira
Android in 2024: New Frontiers, Technologies, and Opportunities for Developers
angelicaoliveira
0
140
Crie Aplicativos Inteligentes para Android: Explorando a Gemini API
angelicaoliveira
0
100
Explorando as Novidades do Android: Aprimore seus Aplicativos para uma Experiência Premium
angelicaoliveira
0
92
Android 12 e suas novidades anunciadas no Google IO 2021
angelicaoliveira
1
51
Android Development, career and first steps
angelicaoliveira
0
51
A importância dos testes de UI para o desenvolvimento Android: Desde Espresso até testes para Jetpack Compose
angelicaoliveira
0
100
Como otimizar a entrega de seu aplicativo Android com App Bundle?
angelicaoliveira
0
51
Sequence x Iterable em Kotlin
angelicaoliveira
0
150
Dividir para conquistar Modularização e Features Dinâmicas no Android
angelicaoliveira
1
540
Other Decks in Programming
See All in Programming
Foundation Models frameworkで画像分析
ryodeveloper
1
120
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
500
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
130
ランチタイムLT会3周年!ランチタイムLT会を3年間続けられたお話
y0hgi
1
140
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
170
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
260
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.1k
共通化で考えるべきは、実装より公開する型だった
codeegg
0
240
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
180
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
230
AI時代の仕事技芸論〜ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ(スクフェス仙台 2026バージョン)
kuranuki
0
650
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
210
Featured
See All Featured
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
260
Ethics towards AI in product and experience design
skipperchong
2
330
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
220
The Invisible Side of Design
smashingmag
301
52k
What's in a price? How to price your products and services
michaelherold
247
13k
Unsuck your backbone
ammeep
672
58k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.3k
Navigating Weather and Climate Data
rabernat
0
370
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
350
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
460
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
220
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
Transcript
MELHORE SEUS TESTES EM KOTLIN COM MOCKK Angélica Oliveira Rafael
Toledo
MOCKS (INTRO) Mocks são uma forma de isolar o sistema
que está sendo testado dos componentes que este sistema depende. SUT: System Under Test DOC: Depended On Component
class Dependency1(val value1: Int) class Dependency2(val value2: String) class SystemUnderTest(
val dependency1: Dependency1, val dependency2: Dependency2) { fun calculate() = dependency1.value1 + dependency2.value2.toInt() } MOCKS (INTRO) Exemplo de classe em Kotlin:
@Test fun calculateAddsValues() { val doc1 = mockk<Dependency1>() val doc2
= mockk<Dependency2>() every { doc1.value1 } returns 5 every { doc2.value2 } returns "6" val sut = SystemUnderTest(doc1, doc2) assertEquals(11, sut.calculate()) } MOCKS (INTRO) Testes usando mocks como dependência:
@Test fun calculateAddsValues() { val doc1 = mockk<Dependency1>() val doc2
= mockk<Dependency2>() every { doc1.value1 } returns 5 every { doc2.value2 } returns "6" val sut = SystemUnderTest(doc1, doc2) assertEquals(11, sut.calculate()) } MOCKS (INTRO) Testes usando mocks como dependência:
@Test fun calculateAddsValues() { val doc1 = mockk<Dependency1>() val doc2
= mockk<Dependency2>() every { doc1.value1 } returns 5 every { doc2.value2 } returns "6" val sut = SystemUnderTest(doc1, doc2) assertEquals(11, sut.calculate()) } MOCKS (INTRO) Testes usando mocks como dependência:
@Test fun calculateAddsValues() { val doc1 = mockk<Dependency1>() val doc2
= mockk<Dependency2>() every { doc1.value1 } returns 5 every { doc2.value2 } returns "6" val sut = SystemUnderTest(doc1, doc2) assertEquals(11, sut.calculate()) } MOCKS (INTRO) Testes usando mocks como dependência:
• Notação nativa de Java • Problemas de nulabilidade •
Problemas com imutabilidade MOCKITO x KOTLIN
val service = Mockito.mock(Service::class.java) MOCKITO x KOTLIN
val service = Mockito.mock(Service::class.java) MOCKITO x KOTLIN
val service = Mockito.mock(Service::class.java) Mockito.`when`(service.fetchData()).thenReturn(...) MOCKITO x KOTLIN
val service = Mockito.mock(Service::class.java) Mockito.`when`(service.fetchData()).thenReturn(...) MOCKITO x KOTLIN
val service = Mockito.mock(ServiceImpl::class.java) MOCKITO x KOTLIN
val service = Mockito.mock(ServiceImpl::class.java) org.mockito.exceptions.base.MockitoException: Mockito cannot mock/spy following: com.thoughtworks.radar.ServiceImpl
– final classes – anonymous classes – primitive types MOCKITO x KOTLIN
Mockito.`when`(service).fetchUserWithId(any()) .thenReturn(mockUser) MOCKITO x KOTLIN
Mockito.`when`(service).fetchUserWithId(any()) .thenReturn(mockUser) MOCKITO x KOTLIN
Mockito.`when`(service).fetchUserWithId(any()) .thenReturn(mockUser) java.lang.NullPointerException MOCKITO x KOTLIN
MOCKK • Biblioteca para mocks em Kotlin • Possibilita escrever
testes de forma mais concisa • Features da linguagem são aproveitadas (lambdas, coroutines…)
EXEMPLOS Argument matchers: every { mock.call(more(5)) } returns 1 every
{ mock.call(or(less(5), eq(5))) } returns -1 any(), isNull(), ofType(type) Lista completa em: https://mockk.io/#matchers
EXEMPLOS Resposta esperada: every { mock1.call(5) } returnsMany listOf(1, 2,
3) every { mock1.call(5) } returns 1 andThen 2 andThen 3
EXEMPLOS Resposta esperada: every { mock1.call(5) } throws RuntimeException("error happened")
EXEMPLOS Relaxed mocks: val mock = mockk<Divider>(relaxed = true)
EXEMPLOS - MOCK DE OBJECTS object MockObj { fun add(a:
Int, b: Int) = a + b } mockkObject(MockObj) // aplica o mock ao Object assertEquals(3, MockObj.add(1, 2)) every { MockObj.add(1, 2) } returns 55 assertEquals(55, MockObj.add(1, 2))
EXEMPLOS - MOCK DE EXTENSION FUNCTIONS data class Obj(val value:
Int) // declarado no arquivo File.kt (pacote "pkg") fun Obj.extensionFunc() = value + 5 mockkStatic("pkg.FileKt") every { Obj(5).extensionFunc() } returns 11 assertEquals(11, Obj(5).extensionFunc()) verify { Obj(5).extensionFunc() }
EXEMPLOS - MOCK DE COROUTINES val car = mockk<Car>() coEvery
{ car.drive(Direction.NORTH) } returns Outcome.OK car.drive(Direction.NORTH) // returns OK coVerify { car.drive(Direction.NORTH) }
MOCKK NO ANDROID • Funciona com o uso da dependência
mockk-android • Compartilhamento entre mocks testImplementation 'io.mockk:mockk:1.9.3' androidTestImplementation 'io.mockk:mockk-android:1.9.3'
#TWTechRadar Feedbacks?
[email protected]
ou
[email protected]
OBRIGADA!