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 — предоставляет свои уникальные инструменты для удобного и эффективного тестирования. Их комбинация может значительно улучшить качество вашего кода и покрытие тестами.