Mockito ile Taklit Nesneler
Mockito ve MockK ile bağımlılıkları yalıtın. Dönüş değerlerini taklit edin, etkileşimleri doğrulayın, bağımsız değişkenleri yakalayın ve kısmi taklit için casusları kullanın.
Mockito ile Taklit Nesneler, CoddyKit'te ücretsiz bir Android Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Android Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Android Academy kursu toplamda 4 dersten oluşur.
Mock Kullanımı Nedir?
Mock, testlerde gerçek bir bağımlılığın yerine geçen sahte bir nesnedir. Çalışan, bellek içi bir uygulama olan sahte nesneden farklı olarak Mock:
- Bir kitaplık tarafından otomatik olarak oluşturulur
- Hangi yöntemlerin, hangi bağımsız değişkenlerle çağrıldığını kaydeder
- Döndürmesini söylediğiniz her şeyi döndürür (taslak oluşturma)
- Testten sonra etkileşimleri doğrulamanıza olanak tanır
Mockito Kurulumu
Mockito ve MockK'yi (Kotlin öncelikli alternatif) app/build.gradle dosyasına ekleyin:
// 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'Mock Oluşturma
mock() veya @Mock açıklamasıyla Mock'lar oluşturun:
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()
}Taslak Oluşturma — Döndürülen Değerleri Tanımlama
Bir Mock'un ne döndüreceğini ayarlamak için whenever(mock.method()).thenReturn(value) kullanın:
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() — Etkileşimleri Denetleme
Bir yöntemin çağrıldığını ve kaç kez çağrıldığını doğrulamak için verify() kullanın:
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, bir Mock yöntemine geçirilen bağımsız değişkeni yakalayarak değerini doğrulamanıza olanak tanır:
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 — Kotlin Öncelikli Mock Kullanımı
MockK, Kotlin için tasarlanmıştır ve uzantı işlevlerini, korutinleri ve nesneleri yerel olarak işleyebilir:
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() }MockK ile Korutinlerde Mock Kullanımı
Suspend işlevleri için coEvery ve coVerify kullanın:
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 — Kısmi Mock Kullanımı
spy, gerçek bir nesneyi sarmalar. Üzerine yazılmadıkça gerçek yöntemler varsayılan olarak çağrılır:
// 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"Mock'lar ve Sahte Nesneler Ne Zaman Kullanılır?
Uygulamaya dönük yönergeler:
- Sahte nesne kullanın: çalışan bir bellek içi uygulamaya (DAO, repository) ihtiyacınız olduğunda — okunması daha kolaydır ve kitaplık gerektirmez
- Mock kullanın: belirli bir yöntemin belirli bağımsız değişkenlerle çağrıldığını doğrulamanız gerektiğinde (analiz etkinlikleri, API çağrıları)
- Aşırı Mock kullanımından kaçının — her şeyi Mock'lama durumunda testleriniz mantığınızı değil, Mock'ları doğrular
Yaygın Hatalar
Mock kullanırken kaçınılması gereken tuzaklar:
- Değer nesnelerinde Mock kullanmak — veri sınıflarında değil, arayüzlerde/soyutlamalarda Mock kullanın
- Çok derin Mock kullanmak — tek bir testte 5 Mock'a ihtiyacınız varsa kod fazla sıkı bağlanmıştır
- Etkileşim önemliyken doğrulama yapmamak — yalnızca taslak oluşturmayın, doğrulama da yapın
- Mockito + Kotlin varsayılanları — Kotlin parametreleri varsayılan olarak null olamaz; beklenmedik null değerlerden kaçınmak için
mockito-kotlinveya MockK kullanın
Nesnelerde ve Companion Nesnelerinde Mock Kullanımı
MockK, Kotlin nesnelerinde ve companion nesnelerinde Mock kullanabilir; bu işlem Mockito ile mümkün değildir:
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)Hızlı Kontrol
Mockito veya MockK testinde verify() işlevinin amacı nedir?
Özet: Mockito ve MockK ile Mock Kullanımı
Mock'lar davranışı yalıtmanızı ve doğrulamanızı sağlar:
mock()/mockk()— bir arayüzden veya sınıftan Mock oluştururwhenever(...).thenReturn(...)/every { } returns ...— döndürülen değerler için taslak oluştururcoEvery/coVerify— Kotlin suspend işlevleri için (MockK)verify(mock).method(args)— yöntemin çağrıldığını doğrularArgumentCaptor— bağımsız değişkenleri yakalar ve incelerspy()/spyk()— gerçek bir nesnenin kısmi Mock'u- Veriler için sahte nesneleri, davranışı doğrulamak için Mock'ları tercih edin
Sırada: Espresso ile kullanıcı arayüzü testi.
Sıkça Sorulan Sorular
“Mockito ile Taklit Nesneler” dersi ücretsiz mi?
Evet — “Mockito ile Taklit Nesneler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Android Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Android Academy kursu toplamda 4 dersten oluşur.
“Mockito ile Taklit Nesneler” dersinde ne öğreneceğim?
Mockito ve MockK ile bağımlılıkları yalıtın. Dönüş değerlerini taklit edin, etkileşimleri doğrulayın, bağımsız değişkenleri yakalayın ve kısmi taklit için casusları kullanın. Android Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Android Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Android Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Mockito ile Taklit Nesneler” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Android Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Android Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- JUnit ile Birim Testi
- Mockito ile Taklit Nesneler
- Espresso ile Kullanıcı Arayüzü Testi
- Hata Ayıklama ve Profil Oluşturma