← Назад к вопросам

Как работает expect?

2.0 Middle🔥 21 комментариев
#Kotlin основы

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Работа с expect в Kotlin для тестирования

expect является ключевым термином в многомодульных проектах Kotlin и используется в контексте ожидаемых (expected) и фактических (actual) объявлений. Однако в вашем вопросе, скорее всего, речь идет о функции expect() из библиотеки тестирования, например, Kotlin Test. Я рассмотрю обе интерпретации.

expect как функция assertion в тестировании

В библиотеках для тестирования, таких как Kotlin Test или аналогах, expect (или expect()) — это функция для проверки утверждений (assertions). Она позволяет сравнить ожидаемое значение с фактическим результатом выполнения теста.

Основной принцип работы:

  • Вы указываете ожидаемое значение.
  • Вы указываете фактическое значение, полученное в ходе выполнения теста.
  • Функция внутренне сравнивает эти два значения.
  • Если они не совпадают, тест считается неудачным (fail) и выбрасывается исключение (обычно AssertionError).

Пример использования expect в Kotlin Test:

import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe

class MyTestClass : StringSpec({
    "test addition" {
        val result = 2 + 3
        // Использование assertion (в Kotest это often 'shouldBe', но концепция 'expect' аналогична)
        result shouldBe 5 // expect(result == 5)
    }
})

В других фреймворках синтаксис может отличаться, но логика идентична:

// Пример похожей функции в простом assert
fun expect(actual: Int, expected: Int) {
    if (actual != expected) {
        throw AssertionError("Expected $expected, but got $actual")
    }
}

// Использование
expect(5, 2+3) // Тест пройдет
expect(6, 2+3) // Тест упадет с AssertionError

Ключевые особенности expect как функции assertion:

  • Определяет успех/неудачу теста: Является центральным механизмом проверки в unit-тестах.
  • Может проверять разные условия: Не только равенство, но и истинность булевых выражений, наличие исключений, соответствие коллекций и т.д. (в зависимости от библиотеки).
  • Часто предоставляет информативные сообщения: При неудаче выводит детали, помогающие быстро локализовать проблему.
  • Интегрируется со средой выполнения тестов: Результат проверки сообщается фреймворку (JUnit, TestNG, Kotest) для формирования финального отчета.

expect как ключевое слово для многомодульных проектов Kotlin (KMP)

В контексте Kotlin Multiplatform (KMP), expect и actual — это ключевые слова языка, предназначенные для разделения объявлений общего (shared) код.

Как это работает:

  1. В общем модуле (common) вы объявляете expect класс, функцию или свойство. Это указывает, что данная сущность ожидается (must be provided) в каждом конкретном модуле (platform).
  2. В платформенных модулях (Android, iOS, JVM, JS) вы предоставляете actual реализацию, соответствующую этой платформе.

Пример структуры в KMP:

// В common модуле: Ожидаемое объявление
expect class PlatformDateFormat() {
    fun formatDate(timestamp: Long): String
}

// В android модуле: Фактическая реализация для Android
actual class PlatformDateFormat {
    actual fun formatDate(timestamp: Long): String {
        return SimpleDateFormat("yyyy-MM-dd").format(Date(timestamp))
    }
}

// В ios модуле: Фактическая реализация для iOS
actual class PlatformDateFormat {
    actual fun formatDate(timestamp: Long): String {
        // Использование NSDateFormatter
        // ...
    }
}

Ключевые особенности expect/actual в KMP:

  • Позволяет писать общий код с платформенно-специфичными реализациями: Является основой для многомодульности в Kotlin.
  • Обеспечивает проверку на этапе компиляции: Компилятор требует, чтобы каждое expect объявление имело соответствующее actual во всех платформенных модулях, участвующих в проекте.
  • Поддерживает различные сущности: Классы, функции, свойства, объекты, аннотации.

Вывод

В зависимости от контекста вашего вопроса:

  • Если речь о тестировании, expect — это функция или подход для проверки соответствия ожидаемого и фактического результатов, краеугольный камень любого unit-теста.
  • Если речь о многомодульной архитектуре Kotlin (KMP), expect — это ключевое слово для объявления ожидаемой (но еще не реализованной) сущности в общем коде, которая затем должна быть предоставлена (actual) в каждом платформенном модуле.

Оба использования являются важными частью профессиональной разработки на Kotlin: тестирование обеспечивает надежность кода, а механизм expect/actual в KMP позволяет эффективно создавать кросс-платформенные решения.

Как работает expect? | PrepBro