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
110
Explorando as Novidades do Android: Aprimore seus Aplicativos para uma Experiência Premium
angelicaoliveira
0
97
Android 12 e suas novidades anunciadas no Google IO 2021
angelicaoliveira
1
56
Android Development, career and first steps
angelicaoliveira
0
54
A importância dos testes de UI para o desenvolvimento Android: Desde Espresso até testes para Jetpack Compose
angelicaoliveira
0
110
Como otimizar a entrega de seu aplicativo Android com App Bundle?
angelicaoliveira
0
53
Sequence x Iterable em Kotlin
angelicaoliveira
0
150
Dividir para conquistar Modularização e Features Dinâmicas no Android
angelicaoliveira
1
550
Other Decks in Programming
See All in Programming
Hono + Inertia + React で LP を構築した話
oukayuka
2
220
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
3
1.5k
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
1
130
tsc.rip を支える技術 / Kyoto.なんか #8
susisu
0
4.3k
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
0
530
What We Talk About When We Talk About XP
m_seki
2
380
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
270
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
570
AIエージェント時代のコードレビューを設計する
nogu66
6
2.5k
MIZARU@SPAJAM2026 第二回予選
1901drama
0
110
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
110
AIを上手に使っていこうとしたら越境せざるを得なくなった話 〜実践1年で見えた境界を越えなければならない理由と進め方〜 / Crossing borders with AI
tomoyakitaura
3
1.1k
Featured
See All Featured
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
320
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Are puppies a ranking factor?
jonoalderson
2
3.9k
The Curious Case for Waylosing
cassininazir
1
500
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
500
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
370
Mind Mapping
helmedeiros
1
350
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
510
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
660
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
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!