Slide 1

Slide 1 text

KOTLIN'DE MOCKLAMA VE MOCKK

Slide 2

Slide 2 text

BEN KIMIM ➤ Lead Android Dev @CizitzenMe ➤ https://haditok.com

Slide 3

Slide 3 text

UNIT TESTING NEDIR? ➤ Unit: En küçük test edilebilir birim (Class, Function) ➤ Birimler diğer birimlerden bağımısız olarak test edilir. ➤ Diğer birimler Mock veya Fake ile değiştirilir.

Slide 4

Slide 4 text

TEST EDILEBILIR KOD ➤ Separations of concerns ➤ Dependency injection ➤ Clean code

Slide 5

Slide 5 text

FAKE ➤ Anlamı: Sahte ➤ Daha önceden belirlenmiş değerleri dönerek kontrollü bir ortam sağlama

Slide 6

Slide 6 text

MOCKING NEDIR? Kuzey Alaycı kuşu (Mimus polyglottos)

Slide 7

Slide 7 text

MOCK ➤ Anlamı: Taklit, Alay ➤ Unit testlerde test ettiğimiz birimin ihtiyacı olan objeleri objeleri taklit ederek, bu objeler üzerinde tam kontrol sağlar

Slide 8

Slide 8 text

NELERI KONTROL EDIYORUZ? ➤ Değişken ve fonksiyonların döneceği değerleri ➤ Fonksiyonların doğru parametreler ile çağırılıp çağrılmadığını

Slide 9

Slide 9 text

NEDEN MOCKK ➤ Saf Kotlin için bir framework ➤ Domain Specific Language(DSL)

Slide 10

Slide 10 text

data class User(val userId: String, val userName: String)

Slide 11

Slide 11 text

data class User(val userId: String, val userName: String) interface UserApi { fun deleteUser(userId: String): Boolean }

Slide 12

Slide 12 text

data class User(val userId: String, val userName: String) interface UserApi { fun deleteUser(userId: String): Boolean } class UserManager(private val userApi: UserApi) { fun deleteUser(user: User): Boolean { return userApi.deleteUser(user.userId) } }

Slide 13

Slide 13 text

@Test fun basicTest() { val userApi: UserApi = mockk() }

Slide 14

Slide 14 text

@Test fun basicTest() { val userApi: UserApi = mockk() val userManager = UserManager(userApi) }

Slide 15

Slide 15 text

@Test fun basicTest() { val userApi: UserApi = mockk() val userManager = UserManager(userApi) val userId = "123" val user: User = mockk() every { user.userId } returns userId }

Slide 16

Slide 16 text

@Test fun basicTest() { val userApi: UserApi = mockk() val userManager = UserManager(userApi) val userId = "123" val user: User = mockk() every { user.userId } returns userId every { userApi.deleteUser(userId) } returns true }

Slide 17

Slide 17 text

@Test fun basicTest() { val userApi: UserApi = mockk() val userManager = UserManager(userApi) val userId = "123" val user: User = mockk() every { user.userId } returns userId every { userApi.deleteUser(userId) } returns true val result = userManager.deleteUser(user) }

Slide 18

Slide 18 text

@Test fun basicTest() { val userApi: UserApi = mockk() val userManager = UserManager(userApi) val userId = "123" val user: User = mockk() every { user.userId } returns userId every { userApi.deleteUser(userId) } returns true val result = userManager.deleteUser(user) assert(result).toBe(true) }

Slide 19

Slide 19 text

@Test fun basicTest() { val userApi: UserApi = mockk() val userManager = UserManager(userApi) val userId = "123" val user: User = mockk() every { user.userId } returns userId every { userApi.deleteUser(userId) } returns true val result = userManager.deleteUser(user) assert(result).toBe(true) verify { userApi.deleteUser(userId) } }

Slide 20

Slide 20 text

@Test fun basicTest() { val userApi: UserApi = mockk() val userManager = UserManager(userApi) val userId = "123" val user: User = mockk() every { user.userId } returns userId every { userApi.deleteUser(userId) } returns true val result = userManager.deleteUser(user) assert(result).toBe(true) verify { userApi.deleteUser(match { it.startsWith("12") }) } }

Slide 21

Slide 21 text

@Test fun basicTest() { val userApi: UserApi = mockk() val userManager = UserManager(userApi) val userId = "123" val user: User = mockk() every { user.userId } returns userId every { userApi.deleteUser(userId) } returns true val result = userManager.deleteUser(user) assert(result).toBe(true) verify { userApi.deleteUser(any()) } }

Slide 22

Slide 22 text

@MockK lateinit var userApi: UserApi @MockK lateinit var user: User val userId = “123" lateinit var userManager:UserManager @Before fun initTests() { MockKAnnotations.init(this) userManager = UserManager(userApi) every { user.userId } returns userId } @Test fun basicTest() { every { userApi.deleteUser(userId) } returns true val result = userManager.deleteUser(user) assert(result).toBe(true) verify { userApi.deleteUser(userId) } }

Slide 23

Slide 23 text

OBJECT MOCK

Slide 24

Slide 24 text

object Calculator { fun add(first: Int, second: Int) = first + second }

Slide 25

Slide 25 text

object Calculator { fun add(first: Int, second: Int) = first + second } @Test fun objectMock() { val result = Calculator.add(1, 2) assert(result).toBe(3) }

Slide 26

Slide 26 text

object Calculator { fun add(first: Int, second: Int) = first + second } @Test fun objectMock() { val result = Calculator.add(1, 2) assert(result).toBe(3) mockkObject(Calculator) }

Slide 27

Slide 27 text

object Calculator { fun add(first: Int, second: Int) = first + second } @Test fun objectMock() { val result = Calculator.add(1, 2) assert(result).toBe(3) mockkObject(Calculator) every { Calculator.add(1, 2) } returns 42 }

Slide 28

Slide 28 text

object Calculator { fun add(first: Int, second: Int) = first + second } @Test fun objectMock() { val result = Calculator.add(1, 2) assert(result).toBe(3) mockkObject(Calculator) every { Calculator.add(1, 2) } returns 41 val mockedResult = Calculator.add(1, 2) }

Slide 29

Slide 29 text

object Calculator { fun add(first: Int, second: Int) = first + second } @Test fun objectMock() { val result = Calculator.add(1, 2) assert(result).toBe(3) mockkObject(Calculator) every { Calculator.add(1, 2) } returns 41 val mockedResult = Calculator.add(1, 2) assert(mockedResult).toBe(42) }

Slide 30

Slide 30 text

STATIC MOCK

Slide 31

Slide 31 text

public class CalculatorStatic { static int add(int first, int second){ return first+second; } }

Slide 32

Slide 32 text

@Test fun staticMock() { val result = CalculatorStatic.add(1, 2) assert(result).toBe(3) }

Slide 33

Slide 33 text

@Test fun staticMock() { val result = CalculatorStatic.add(1, 2) assert(result).toBe(3) mockkStatic(CalculatorStatic ::class) }

Slide 34

Slide 34 text

@Test fun staticMock() { val result = CalculatorStatic.add(1, 2) assert(result).toBe(3) mockkStatic(CalculatorStatic ::class) every { CalculatorStatic.add(1, 2) } returns 42 }

Slide 35

Slide 35 text

@Test fun staticMock() { val result = CalculatorStatic.add(1, 2) assert(result).toBe(3) mockkStatic(CalculatorStatic ::class) every { CalculatorStatic.add(1, 2) } returns 41 val mockedResult = CalculatorStatic.add(1, 2) }

Slide 36

Slide 36 text

@Test fun staticMock() { val result = CalculatorStatic.add(1, 2) assert(result).toBe(3) mockkStatic(CalculatorStatic ::class) every { CalculatorStatic.add(1, 2) } returns 41 val mockedResult = CalculatorStatic.add(1, 2) assert(mockedResult).toBe(42) }

Slide 37

Slide 37 text

COROUTINES

Slide 38

Slide 38 text

data class User(val userId: String, val userName: String) interface UserApi { suspend fun deleteUser(userId: String): Boolean }

Slide 39

Slide 39 text

data class User(val userId: String, val userName: String) interface UserApi { suspend fun deleteUser(userId: String): Boolean } class UserManager(private val userApi: UserApi) { suspend fun deleteUser(user: User): Boolean { return userApi.deleteUser(user.userId) } }

Slide 40

Slide 40 text

@Test fun basicTest() = runBlocking { }

Slide 41

Slide 41 text

@Test fun basicTest() = runBlocking { val userApi: UserApi = mockk() val userManager = UserManager(userApi) val userId = "123" val user: User = mockk() every { user.userId } returns userId }

Slide 42

Slide 42 text

@Test fun basicTest() = runBlocking { val userApi: UserApi = mockk() val userManager = UserManager(userApi) val userId = "123" val user: User = mockk() every { user.userId } returns userId coEvery { userApi.deleteUser(userId) } returns true }

Slide 43

Slide 43 text

@Test fun basicTest() = runBlocking { val userApi: UserApi = mockk() val userManager = UserManager(userApi) val userId = “123" val user: User = mockk() every { user.userId } returns userId coEvery { userApi.deleteUser(userId) } returns true val result = userManager.deleteUser(user) }

Slide 44

Slide 44 text

@Test fun basicTest() = runBlocking { val userApi: UserApi = mockk() val userManager = UserManager(userApi) val userId = “123" val user: User = mockk() every { user.userId } returns userId coEvery { userApi.deleteUser(userId) } returns true val result = userManager.deleteUser(user) assert(result).toBe(true) coVerify { userApi.deleteUser(userId) } }

Slide 45

Slide 45 text

LIMITASYONLAR ➤ final static ➤ inline fonksiyonlar

Slide 46

Slide 46 text

UNIT TESTS WITHOUT INTEGRATION TESTS (ZORUNLU GIF)

Slide 47

Slide 47 text

TEŞEKKÜRLER HTTPS://MOCKK.IO/