Mockk का परिचय: यह क्या है और क्यों ज़रूरी है
Mockk Kotlin प्रोग्रामिंग भाषा में मॉकिंग (ऑब्जेक्ट्स का नकली वर्जन बनाना) के लिए एक आधुनिक लाइब्रेरी है। इसे खासतौर पर Kotlin की विशेषताओं को ध्यान में रखकर बनाया गया है: nullability, extension functions, coroutines, companion objects और अन्य फीचर्स जो Java में नहीं हैं।
Mockk लाइब्रेरी क्यों ज़रूरी है? यूनिट टेस्ट लिखते समय अक्सर ऐसी स्थिति आती है जहां टेस्ट किया जा रहा क्लास दूसरे क्लासेस, सर्विसेज, डेटाबेस या बाहरी API पर निर्भर होता है। टेस्ट किए गए कोड को अलग करने और टेस्ट को तेज़, भरोसेमंद और बाहरी कारकों से स्वतंत्र बनाने के लिए हम "मॉक" (mock objects) बनाते हैं — ये नकली ऑब्जेक्ट्स होते हैं जो असली डिपेंडेंसी के व्यवहार की नकल करते हैं।
Mockk की मुख्य क्षमताएं:
- क्लासेस, इंटरफेसेस और ऑब्जेक्ट्स के लिए मॉक बनाना
- एनोटेशन सपोर्ट (@MockK, @RelaxedMockK, @SpyK)
- कोरुटीन के साथ काम (coEvery, coVerify)
- एक्सटेंशन फंक्शन का मॉकिंग
- स्टैटिक मेथड और कम्पैनियन ऑब्जेक्ट का मॉकिंग
- स्लॉट (slot) और आर्गुमेंट कैप्चर का सपोर्ट
- पार्शियल मॉकिंग (spy) का सपोर्ट
Mockk की इंस्टॉलेशन
Mockk Maven Central के ज़रिए उपलब्ध है। इसे प्रोजेक्ट में जोड़ने के लिए build.gradle.kts फ़ाइल में डिपेंडेंसी जोड़ें (Gradle Kotlin DSL के लिए):
// build.gradle.kts
dependencies {
testImplementation("io.mockk:mockk:1.13.10")
}
Gradle Groovy DSL के लिए:
// build.gradle
dependencies {
testImplementation "io.mockk:mockk:1.13.10"
}
Maven के लिए:
<dependency>
<groupId>io.mockk</groupId>
<artifactId>mockk</artifactId>
<version>1.13.10</version>
<scope>test</scope>
</dependency>
अगर आप कोरुटीन का उपयोग कर रहे हैं, तो अलग से कुछ जोड़ने की ज़रूरत नहीं — कोरुटीन सपोर्ट Mockk में बिल्ट-इन है।
कोड उदाहरण के साथ त्वरित शुरुआत
एक सरल उदाहरण देखते हैं। मान लीजिए हमारे पास एक UserService सर्विस है जो UserRepository रिपॉजिटरी पर निर्भर है:
// टेस्ट करने के लिए क्लासेस
class UserRepository {
fun findById(id: Long): String {
// असली इम्प्लीमेंटेशन डेटाबेस से डेटा लाता है
return "Real User"
}
}
class UserService(private val repository: UserRepository) {
fun getUserName(id: Long): String {
val user = repository.findById(id)
return if (user.isNotEmpty()) user else "Unknown"
}
}
अब Mockk का उपयोग करके टेस्ट लिखते हैं:
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import org.junit.jupiter.api.Test
class UserServiceTest {
@Test
fun `getUserName को रिपॉजिटरी से यूज़र नाम लौटाना चाहिए`() {
// 1. रिपॉजिटरी के लिए मॉक बनाएं
val mockRepository = mockk<UserRepository>()
// 2. मॉक का व्यवहार परिभाषित करें
every { mockRepository.findById(1L) } returns "John Doe"
// 3. मॉक के साथ टेस्ट किया जाने वाला ऑब्जेक्ट बनाएं
val service = UserService(mockRepository)
// 4. टेस्ट मेथड को कॉल करें
val result = service.getUserName(1L)
// 5. परिणाम की जांच करें
assert(result == "John Doe")
// 6. जांचें कि मेथड को ठीक 1 बार कॉल किया गया
verify(exactly = 1) { mockRepository.findById(1L) }
}
}
Mockk के मुख्य तरीके और फंक्शन
लाइब्रेरी के 10 प्रमुख तरीकों को विस्तृत विवरण और उदाहरणों के साथ देखते हैं।
1. mockk() — मॉक-ऑब्जेक्ट बनाना
यह क्या करता है: दिए गए क्लास या इंटरफेस के लिए एक मॉक-ऑब्जेक्ट बनाता है। मॉक के सभी मेथड डिफ़ॉल्ट रूप से डिफ़ॉल्ट वैल्यू (null, 0, false) लौटाते हैं और अगर व्यवहार परिभाषित नहीं किया गया तो एक्सेप्शन फेंकते हैं।
पैरामीटर:
cls: KClass<T>