Имитация с MockK
Имитируйте зависимости
«Имитация с MockK» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 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 или используйте расширение JUnit5 MockKExtension, чтобы сбрасывать состояние имитаций между тестами и избегать его утечки.
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» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.
Чему я научусь в уроке «Имитация с MockK»?
Имитируйте зависимости Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Kotlin Academy?
Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Имитация с MockK»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Kotlin Academy?
Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Написание тестов с JUnit5
- Проверки
- Имитация с MockK
- Тестирование сопрограмм