← Back to Kotlin Course | Chapter 13: Error Handling & Testing | Lesson 6 of 6

Mocking के Basics

Mocking का मतलब है किसी असली, जटिल code के टुकड़े के लिए एक नकली stand-in बनाना, ताकि कोई test सिर्फ उस हिस्से पर केंद्रित हो सके जिसकी उसे असल में परवाह है।
Syntax
kotlin
val mock = mockk<InterfaceName>()

every { mock.method(argument) } returns value

// call the code under test

verify { mock.method(argument) }

Creating a Mock

MockK जैसी एक mocking library test time पर किसी interface या class का एक नकली implementation generate कर सकती है, आपको बिल्कुल control करने देते हुए कि यह कैसे व्यवहार करे बिना किसी असली implementation की ज़रूरत के।

Warning: यह उदाहरण एक third-party testing/mocking library उपयोग करता है जो साधारण Kotlin standard library का हिस्सा नहीं है और इसे एक project dependency के रूप में जोड़ना चाहिए (जैसे Gradle के ज़रिए) -- यह बिना किसी dependency वाले plain kotlinc sandbox में नहीं चल सकता।

उदाहरण: Creating a Mock

markup
import io.mockk.mockk
import io.mockk.every

interface UserRepository {
    fun findName(id: Int): String
}

fun main() {
    val repo = mockk<UserRepository>()
    every { repo.findName(1) } returns "Ana"
    println(repo.findName(1))
}

Stubbing Behavior with every

every { mock.method(args) } returns value बिल्कुल configure करता है कि किसी specific call के लिए एक mock को क्या return करना चाहिए, किसी test को किसी भी scenario simulate करने देते हुए, edge cases सहित जो किसी असली implementation से trigger करना मुश्किल हो।

Warning: यह उदाहरण एक third-party testing/mocking library उपयोग करता है जो साधारण Kotlin standard library का हिस्सा नहीं है और इसे एक project dependency के रूप में जोड़ना चाहिए (जैसे Gradle के ज़रिए) -- यह बिना किसी dependency वाले plain kotlinc sandbox में नहीं चल सकता।

उदाहरण: Stubbing Behavior with every

markup
import io.mockk.mockk
import io.mockk.every

interface PaymentGateway {
    fun charge(amount: Double): Boolean
}

fun main() {
    val gateway = mockk<PaymentGateway>()
    every { gateway.charge(100.0) } returns false
    println("Charge succeeded: ${gateway.charge(100.0)}")
}

Verifying Interactions

verify { mock.method(args) } जांचता है कि किसी test के दौरान एक mock असल में उम्मीद के मुताबिक तरीके से call हुआ, सिर्फ एक return value के बजाय side-effecting behavior की पुष्टि करने के लिए उपयोगी।

Warning: यह उदाहरण एक third-party testing/mocking library उपयोग करता है जो साधारण Kotlin standard library का हिस्सा नहीं है और इसे एक project dependency के रूप में जोड़ना चाहिए (जैसे Gradle के ज़रिए) -- यह बिना किसी dependency वाले plain kotlinc sandbox में नहीं चल सकता।

उदाहरण: Verifying Interactions

markup
import io.mockk.mockk
import io.mockk.verify
import io.mockk.every

interface Logger {
    fun log(message: String)
}

fun main() {
    val logger = mockk<Logger>(relaxed = true)
    logger.log("Application started")
    verify { logger.log("Application started") }
}

Mocking in a Test Context

Mocks आमतौर पर किसी JUnit या Kotest test के अंदर test किए जा रहे code को उसकी असली dependencies, जैसे एक database या network client, से isolate करने के लिए उपयोग होते हैं, जो अन्यथा test को धीमा या अविश्वसनीय बना देते।

Warning: यह उदाहरण एक third-party testing/mocking library उपयोग करता है जो साधारण Kotlin standard library का हिस्सा नहीं है और इसे एक project dependency के रूप में जोड़ना चाहिए (जैसे Gradle के ज़रिए) -- यह बिना किसी dependency वाले plain kotlinc sandbox में नहीं चल सकता।

उदाहरण: Mocking in a Test Context

markup
import io.mockk.mockk
import io.mockk.every
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions.assertEquals

interface UserRepository {
    fun findName(id: Int): String
}

class GreetingServiceTest {
    @Test
    fun `greets user found in repository`() {
        val repo = mockk<UserRepository>()
        every { repo.findName(1) } returns "Ana"
        val greeting = "Hello, ${repo.findName(1)}!"
        assertEquals("Hello, Ana!", greeting)
    }
}
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. किसी ऐसी type को mock करना जिसमें कोई असली behavioral seam न हो (जैसे एक साधारण data class), जबकि एक असली instance के साथ test करना सरल और ज़्यादा मायने रखने वाला होता।
  2. किसी mock के method behavior को call करने से पहले stub करना भूल जाना, जिससे test में एक default (अक्सर बेकार) return value मिलती है।
  3. इतना ज़्यादा mocking करना कि test असली test किए जा रहे code के बारे में किसी मायने रखने वाली चीज़ के बजाय mock के अपने configured behavior को verify करता है।
चैप्टर सारांश
  • Mocking किसी dependency का एक नकली stand-in implementation बनाता है, tests को इसके behavior को सटीक रूप से control करने देते हुए।
  • MockK एक लोकप्रिय Kotlin-first mocking library है, आमतौर पर JUnit या Kotest के साथ उपयोग होती है।
  • every { mock.method() } returns value किसी specific call के लिए एक mock के behavior को stub करता है।
  • verify { mock.method() } जांचता है कि test के दौरान mock के साथ एक particular interaction असल में हुआ।
🔒

Chapter Quiz — Complete all 6 topics to unlock

0/6 topics done

Complete these topics first:

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.