Mocking dengan Mockito
Asingkan kebergantungan dengan Mockito dan MockK. Tetapkan nilai pulangan palsu, sahkan interaksi, tangkap argumen dan gunakan spy untuk mocking separa.
Mocking dengan Mockito ialah pelajaran Android Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Android Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Android Academy merangkumi sejumlah 4 pelajaran.
Apakah Pengolokan?
Olok-olok ialah objek palsu yang menggantikan kebergantungan sebenar dalam ujian. Berbeza daripada Palsu (pelaksanaan dalam memori yang berfungsi), olok-olok:
- Dijana secara automatik oleh pustaka
- Merekod kaedah yang dipanggil dan argumen yang digunakan
- Mengembalikan apa sahaja yang anda tetapkan untuk dikembalikan (penyamaran)
- Membolehkan anda mengesahkan interaksi selepas ujian
Persediaan Mockito
Tambahkan Mockito dan MockK (alternatif yang mengutamakan Kotlin) pada app/build.gradle:
// app/build.gradle:
testImplementation 'org.mockito:mockito-core:5.10.0'
testImplementation 'org.mockito.kotlin:mockito-kotlin:5.2.1'
// MockK (Kotlin-idiomatic alternative to Mockito):
testImplementation 'io.mockk:mockk:1.13.10'Mencipta Olok-olok
Cipta olok-olok dengan mock() atau anotasi @Mock:
import org.mockito.kotlin.*
interface UserApi {
suspend fun fetchUsers(): List<User>
suspend fun deleteUser(id: Int)
}
class RepositoryTest {
// Option 1: create inline
private val api: UserApi = mock()
// Option 2: use annotation + MockitoJUnit4Runner
@Mock lateinit var api2: UserApi
@get:Rule
val mockitoRule = MockitoJUnit.rule()
}Penyamaran — Menentukan Nilai Pulangan
Gunakan whenever(mock.method()).thenReturn(value) untuk menetapkan nilai yang dikembalikan oleh olok-olok:
val api: UserApi = mock()
// Stub a return value:
whenever(api.fetchUsers()).thenReturn(
listOf(User(1, "Alice"), User(2, "Bob"))
)
// Stub an exception:
whenever(api.fetchUsers()).thenThrow(RuntimeException("Network error"))
// Return different values on consecutive calls:
whenever(api.fetchUsers())
.thenReturn(emptyList()) // first call
.thenReturn(listOf(User(1, "Alice"))) // second callverify() — Menyemak Interaksi
Gunakan verify() untuk menegaskan bahawa sesuatu kaedah telah dipanggil — dan berapa kali:
val api: UserApi = mock()
val repo = UserRepository(api)
repo.refreshUsers()
// Verify that fetchUsers() was called exactly once:
verify(api).fetchUsers()
// Verify called with specific argument:
repo.deleteUser(42)
verify(api).deleteUser(42)
// Verify called exactly 3 times:
verify(api, times(3)).fetchUsers()
// Verify never called:
verify(api, never()).deleteUser(any())ArgumentCaptor
ArgumentCaptor menangkap argumen yang dihantar kepada kaedah olok-olok supaya anda boleh menegaskan nilainya:
val api: UserApi = mock()
val captor = argumentCaptor<User>()
val repo = UserRepository(api)
repo.saveUser(User(1, "Alice"))
verify(api).saveUser(captor.capture())
val captured = captor.firstValue
assertEquals(1, captured.id)
assertEquals("Alice", captured.name)MockK — Pengolokan Mengutamakan Kotlin
MockK direka untuk Kotlin dan mengendalikan fungsi sambungan, coroutine serta objek secara natif:
import io.mockk.*
val api = mockk<UserApi>()
// Stub:
every { api.fetchUsers() } returns listOf(User(1, "Alice"))
// Stub suspend function:
coEvery { api.fetchUsers() } returns listOf(User(1, "Alice"))
// Verify:
val repo = UserRepository(api)
runBlocking { repo.refresh() }
coVerify { api.fetchUsers() }Mengolok Coroutine dengan MockK
Gunakan coEvery dan coVerify untuk fungsi suspend:
val api = mockk<UserApi>()
// Stub suspend function:
coEvery { api.fetchUsers() } returns listOf(User(1, "Alice"))
coEvery { api.deleteUser(any()) } just Runs // returns Unit
// Test:
runTest {
val repo = UserRepository(api)
repo.refresh()
coVerify(exactly = 1) { api.fetchUsers() }
coVerify(exactly = 0) { api.deleteUser(any()) }
}Spy — Pengolokan Separa
spy membalut objek sebenar. Kaedah sebenar dipanggil secara lalai melainkan digantikan:
// Mockito Spy:
val realList = mutableListOf("a", "b", "c")
val spyList = spy(realList)
// Real method called:
spyList.add("d")
assertEquals(4, spyList.size) // real add() was called
// Override specific method:
doReturn(99).`when`(spyList).size
assertEquals(99, spyList.size) // overridden
// MockK Spy:
val spyObj = spyk(RealService())
every { spyObj.expensiveCall() } returns "fake result"Bila Menggunakan Olok-olok berbanding Palsu
Panduan praktikal:
- Gunakan Palsu apabila anda memerlukan pelaksanaan dalam memori yang berfungsi (DAO, repositori) — lebih mudah dibaca dan tidak memerlukan pustaka
- Gunakan Olok-olok apabila anda perlu mengesahkan bahawa kaedah tertentu dipanggil dengan argumen tertentu (peristiwa analitik, panggilan API)
- Elakkan pengolokan berlebihan — jika anda mengolokkan segala-galanya, ujian anda mengesahkan olok-olok, bukannya logik anda
Kesilapan Biasa
Perangkap pengolokan yang perlu dielakkan:
- Mengolok objek nilai — olokkan interface/abstraksi, bukan class data
- Mengolok terlalu mendalam — jika anda memerlukan 5 olok-olok dalam satu ujian, kod itu terlalu bergantung erat
- Tidak membuat pengesahan apabila interaksi penting — jangan hanya menyamar, tetapi buat pengesahan juga
- Lalai Mockito + Kotlin — parameter Kotlin bukan null secara lalai; gunakan
mockito-kotlinatau MockK untuk mengelakkan kejutan nilai null
Mengolok Objek & Objek Companion
MockK boleh mengolok objek Kotlin dan objek companion — sesuatu yang mustahil dilakukan dengan Mockito:
object DateProvider {
fun today(): String = "2024-01-01"
}
// In test:
mockkObject(DateProvider)
every { DateProvider.today() } returns "2099-12-31"
val result = DateProvider.today()
assertEquals("2099-12-31", result)
// Restore after test:
unmockkObject(DateProvider)Semakan Pantas
Apakah tujuan verify() dalam ujian Mockito atau MockK?
Ringkasan: Pengolokan dengan Mockito & MockK
Olok-olok membolehkan anda mengasingkan dan mengesahkan tingkah laku:
mock()/mockk()— mencipta olok-olok daripada interface atau classwhenever(...).thenReturn(...)/every { } returns ...— menyamar nilai pulangancoEvery/coVerify— untuk fungsi suspend Kotlin (MockK)verify(mock).method(args)— menegaskan bahawa kaedah telah dipanggilArgumentCaptor— menangkap dan memeriksa argumenspy()/spyk()— olok-olok separa bagi objek sebenar- Utamakan Palsu untuk data; gunakan Olok-olok untuk mengesahkan tingkah laku
Seterusnya: Pengujian UI dengan Espresso.
Pelajari Kotlin dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 36
- Pelajaran
- 152
Soalan Lazim
Adakah pelajaran “Mocking dengan Mockito” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Android Academy, termasuk “Mocking dengan Mockito”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Android Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Mocking dengan Mockito”?
Asingkan kebergantungan dengan Mockito dan MockK. Tetapkan nilai pulangan palsu, sahkan interaksi, tangkap argumen dan gunakan spy untuk mocking separa. Anda berlatih Android Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Android Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Android Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Mocking dengan Mockito” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Android Academy ini?
Ya. Setiap pelajaran Android Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Ujian Unit dengan JUnit
- Mocking dengan Mockito
- Ujian UI dengan Espresso
- Penyahpepijatan & Pemprofilan