Unit-тестирование в Android

Unit-тестирование в Android — это важная часть процесса разработки, которая помогает убедиться в том, что каждая отдельная часть вашего кода работает правильно. Для тестирования в Android часто используются три ключевые библиотеки: JUnit, MockK, и Truth. Давайте разберем каждую из них по отдельности и посмотрим примеры их использования на языке Kotlin.

1. JUnit

JUnit — это одна из самых популярных библиотек для Unit-тестирования на платформе Java (и Kotlin). Она предоставляет основные инструменты для организации и выполнения тестов.

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

import org.junit.Assert.*
import org.junit.Test

class CalculatorTest {

    @Test
    fun addition_isCorrect() {
        val result = 2 + 2
        assertEquals(4, result)
    }

    @Test
    fun subtraction_isCorrect() {
        val result = 5 - 3
        assertEquals(2, result)
    }
}

Здесь используется assertEquals, который проверяет, что результат вычислений соответствует ожидаемому значению.

2. MockK

MockK — это библиотека для мокинга (создания заглушек) в Kotlin. Она позволяет имитировать поведение зависимостей вашего кода, чтобы изолировать тестируемую логику. Это особенно полезно, когда ваши классы зависят от внешних сервисов, сетевых запросов или базы данных.

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

import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import org.junit.Test

class UserServiceTest {

    private val userRepository: UserRepository = mockk()
    private val userService = UserService(userRepository)

    @Test
    fun `should return user when repository returns user`() {
        // Мокируем поведение userRepository
        every { userRepository.getUserById(1) } returns User(1, "John")

        // Вызов метода сервиса
        val user = userService.getUserById(1)

        // Проверка результата
        assertEquals("John", user.name)

        // Проверяем, что метод getUserById был вызван
        verify { userRepository.getUserById(1) }
    }
}

В этом примере mockk создает заглушку для UserRepository, а every задает поведение для метода getUserById.

3. Truth

Truth — это библиотека от Google, которая предоставляет более удобный синтаксис для написания ассертов (утверждений). Она позволяет писать более "читаемые" тесты.

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

import com.google.common.truth.Truth.assertThat
import org.junit.Test

class TruthTest {

    @Test
    fun `truth example`() {
        val number = 5

        // Проверка того, что число равно 5
        assertThat(number).isEqualTo(5)

        // Проверка списка
        val list = listOf("Kotlin", "Java", "Swift")
        assertThat(list).contains("Kotlin")
        assertThat(list).hasSize(3)
    }
}

Truth предоставляет метод assertThat, который может использоваться для проверки различных условий: равенство, содержание, размер коллекции и так далее.

Основные функции библиотек:

  • JUnit: Основные функции тестирования, такие как assertEquals, assertTrue, assertFalse и т.д.
  • MockK: Функции для создания заглушек и моков, такие как mockk, every, verify, а также возможности для тестирования с slot и capture.
  • Truth: Функции для удобных ассертов, такие как assertThat, с расширениями для работы со строками, коллекциями, исключениями и т.д.

Пример комплексного теста с использованием всех трех библиотек:

import com.google.common.truth.Truth.assertThat
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import org.junit.Test

class ComplexTest {

    private val userRepository: UserRepository = mockk()
    private val userService = UserService(userRepository)

    @Test
    fun `complex test with JUnit, MockK, and Truth`() {
        // Мокируем поведение репозитория
        every { userRepository.getUserById(1) } returns User(1, "Alice")

        // Вызов метода сервиса
        val user = userService.getUserById(1)

        // Проверяем результат с использованием JUnit
        assertEquals("Alice", user.name)

        // Проверяем результат с использованием Truth
        assertThat(user.name).isEqualTo("Alice")
        assertThat(user.id).isEqualTo(1)

        // Проверяем, что метод был вызван
        verify { userRepository.getUserById(1) }
    }
}

Таким образом, каждая из библиотек — JUnit, MockK и Truth — предоставляет свои уникальные инструменты для удобного и эффективного тестирования. Их комбинация может значительно улучшить качество вашего кода и покрытие тестами.