การจำลองด้วย MockK
จำลองสิ่งที่โค้ดต้องพึ่งพา
การจำลองด้วย MockK เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
MockK คืออะไร
MockK คือไลบรารีสำหรับการจำลองที่สร้างขึ้นสำหรับ Kotlin โดยจะสร้างการพึ่งพาเวอร์ชันจำลอง เพื่อให้คุณทดสอบคลาสแยกจากส่วนอื่นได้
- รองรับ Kotlin โดยตรง ทั้งออบเจ็กต์ ฟังก์ชันส่วนขยาย และโครูทีน
- มี DSL ที่อ่านง่ายสำหรับกำหนดพฤติกรรมจำลองและตรวจสอบ
การเพิ่ม MockK
เพิ่ม MockK เป็นการพึ่งพาสำหรับการทดสอบ
dependencies {
testImplementation("io.mockk:mockk:1.13.11")
}การสร้างม็อก
ใช้ mockk<Type>() เพื่อสร้างม็อก โดยค่าเริ่มต้น เมธอดของม็อกจะยังไม่มีการกำหนดพฤติกรรม และจะล้มเหลวหากถูกเรียกใช้
import io.mockk.mockk
interface Repo { fun find(id: Int): String }
val repo = mockk<Repo>()การกำหนดพฤติกรรมด้วย every
กำหนดพฤติกรรมด้วย every { } returns ... ซึ่งจะบอกม็อกว่าต้องคืนค่าอะไรสำหรับการเรียกใช้ที่ระบุ
import io.mockk.every
import io.mockk.mockk
interface Repo { fun find(id: Int): String }
val repo = mockk<Repo>()
// every { repo.find(1) } returns "Ada"การตรวจสอบการเรียกใช้
ใช้ verify { } เพื่อตรวจยืนยันว่าเมธอดถูกเรียกใช้ คุณสามารถกำหนดจำนวนครั้งที่แน่นอนได้
import io.mockk.verify
// verify { repo.find(1) }
// verify(exactly = 2) { repo.find(any()) }
// verify(exactly = 0) { repo.find(99) }ตัวจับคู่าร์กิวเมนต์
ตัวจับคู่าร์กิวเมนต์อย่าง any(), eq() และ match { } ช่วยให้การกำหนดพฤติกรรมจำลองและการตรวจสอบมีความยืดหยุ่น
import io.mockk.every
import io.mockk.mockk
interface Repo { fun find(id: Int): String }
val repo = mockk<Repo>()
// every { repo.find(any()) } returns "X"
// every { repo.find(match { it > 10 }) } returns "big"ม็อกแบบผ่อนปรน
ม็อกแบบ relaxed จะคืนค่าเริ่มต้นที่เหมาะสม (0 สตริงว่าง และอื่น ๆ) สำหรับการเรียกใช้ที่ยังไม่ได้กำหนดพฤติกรรม คุณจึงไม่ต้องกำหนดพฤติกรรมให้ทุกกรณี
import io.mockk.mockk
interface Logger { fun log(msg: String) }
val logger = mockk<Logger>(relaxed = true)การดักจับอาร์กิวเมนต์
ใช้ slot ร่วมกับ capture() เพื่อตรวจสอบอาร์กิวเมนต์ที่ถูกส่งไปยังเมธอดจำลองอย่างละเอียด
import io.mockk.slot
import io.mockk.verify
val msgSlot = slot<String>()
// verify { logger.log(capture(msgSlot)) }
// println(msgSlot.captured)สายลับ
spyk จะห่อหุ้มออบเจ็กต์จริงไว้ โดยเมธอดจริงจะทำงานเว้นแต่คุณจะกำหนดพฤติกรรมจำลอง เหมาะสำหรับการจำลองเพียงบางส่วน
import io.mockk.spyk
class Calc { fun square(n: Int) = n * n }
val calc = spyk(Calc())
// real square runs; you can still verify { calc.square(3) }การโยนข้อยกเว้นจากม็อก
กำหนดให้เมธอดจำลองโยนข้อยกเว้น เพื่อให้คุณทดสอบเส้นทางการจัดการข้อผิดพลาดได้
import io.mockk.every
import io.mockk.mockk
interface Repo { fun find(id: Int): String }
val repo = mockk<Repo>()
// every { repo.find(0) } throws NoSuchElementException()การทำความสะอาด
เรียกใช้ clearAllMocks() ใน @AfterEach หรือใช้ MockKExtension ของ JUnit5 เพื่อรีเซ็ตสถานะของม็อกระหว่างการทดสอบและป้องกันสถานะรั่วไหล
import io.mockk.clearAllMocks
import org.junit.jupiter.api.AfterEach
class ServiceTest {
@AfterEach
fun tearDown() { clearAllMocks() }
}ตรวจสอบอย่างรวดเร็ว
คุณมีม็อกที่มีเมธอดจำนวนมาก แต่สนใจเพียงเมธอดเดียว และต้องการให้เมธอดที่ยังไม่ได้กำหนดพฤติกรรมคืนค่าเริ่มต้นที่ไม่ก่อปัญหา คุณควรสร้างม็อกแบบใด
สรุปทบทวน
MockK ช่วยให้คุณแยกโค้ดที่กำลังทดสอบออกมาได้:
mockk()สร้างม็อก ส่วนevery { } returnsใช้กำหนดพฤติกรรมverify { }ตรวจสอบการโต้ตอบ- ตัวจับคู่าร์กิวเมนต์ การดักจับด้วย
slotการใช้spykและม็อกแบบผ่อนปรน clearAllMocks()ระหว่างการทดสอบ
ถัดไป: การทดสอบโครูทีน
คำถามที่พบบ่อย
บทเรียน “การจำลองด้วย MockK” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การจำลองด้วย MockK” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การจำลองด้วย MockK”
จำลองสิ่งที่โค้ดต้องพึ่งพา คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การจำลองด้วย MockK” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม
ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเขียนเทสต์ด้วย JUnit5
- การยืนยันผล
- การจำลองด้วย MockK
- การทดสอบ Coroutine