Unit Testing ● Unit: Smallest testable component (function, class) ● Units are tested independently from each other ● Other units with dependencies are mocked or faked
Mock ● Not authentic or real, but without the intention to deceive. ● Imitates objects to specify behaviour explicitly and enables full control over the object. ● Usually backed with a library/framework
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) } }
@Test fun basicTest() { val userApi: UserApi = mockk() val userManager = UserManager(userApi) val userId = "123" val user: User = mockk() every { user.userId } returns userId }
@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 }
@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) }
@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) }
@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) } }
@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) } }
@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") }) } }
@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()) } }
@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) } }
object Calculator { fun add(first: Int, second: Int) = first + second } @Test fun objectMock() { val result = Calculator.add(1, 2) assert(result).toBe(3) }
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 }
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 }
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) }
@Test fun staticMock() { val result = CalculatorStatic.add(1, 2) assert(result).toBe(3) mockkStatic(CalculatorStatic::class) every { CalculatorStatic.add(1, 2) } returns 42 }
@Test fun staticMock() { val result = CalculatorStatic.add(1, 2) assert(result).toBe(3) mockkStatic(CalculatorStatic::class) every { CalculatorStatic.add(1, 2) } returns 42 val mockedResult = CalculatorStatic.add(1, 2) }
@Test fun staticMock() { val result = CalculatorStatic.add(1, 2) assert(result).toBe(3) mockkStatic(CalculatorStatic::class) every { CalculatorStatic.add(1, 2) } returns 42 val mockedResult = CalculatorStatic.add(1, 2) assert(mockedResult).toBe(42) }
class Calculator { fun add(first: Int, second: Int) = first + second } @Test fun argumentCapturing() { val calculator:Calculator = mockk() every { calculator.add(any(), any()) } answers { firstArg() + secondArg() } }
class Calculator { fun add(first: Int, second: Int) = first + second } @Test fun argumentCapturing() { val calculator:Calculator = mockk() every { calculator.add(any(), any()) } answers { firstArg() + secondArg() } val mockedResult = calculator.add(1, 2) assert(mockedResult).toBe(3) }
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) } }
@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 }