تكرار السؤال: …
الإجابة المختصرة
بمحاكاة التبعيات عبر mockk() وتحديد سلوكها المتوقع بواسطة every أو coEvery، ثم التحقق من استدعاء الدوال عبر verify أو coVerify.
الشرح
تعتبر MockK مكتبة مصممة أصلاً للغة Kotlin وتدعم Suspend Functions و Coroutines بسلاسة فائقة عبر coEvery و coVerify، بعكس Mockito التي تتطلب إعدادات إضافية. تتيح اختبار الـ ViewModel بمعزل عن الشبكة وقاعدة البيانات عن طريق استبدال الـ Repository بنسخة مقلدة وتأكيد أن الـ UiState تعكس النتيجة بشكل صحيح.
مثال بالكود
class UserViewModelTest {
private val repository = mockk<UserRepository>()
private lateinit var viewModel: UserViewModel
@Test
fun loadUser_updatesStateToSuccess() = runTest {
coEvery { repository.getUser("1") } returns User(1, "Sara")
viewModel = UserViewModel(repository)
viewModel.loadUser("1")
assertEquals(User(1, "Sara"), viewModel.uiState.value.user)
coVerify(exactly = 1) { repository.getUser("1") }
}
}أخطاء شائعة
- الإفراط في استخدام Mocks لكل شيء؛ إذ يفضل دائمًا استخدام Fake Repositories حقيقية بسيطة في الذاكرة كلما كان ذلك متاحًا لتقليل هشاشة الاختبارات.