Как ты выполнял тестовое задание и какие материалы использовал для этого?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Для выполнения тестового задания я использовал Kotlin в качестве основного языка программирования, так как он является рекомендуемым для Android-разработки и предлагает множество преимуществ, таких как безопасность, лаконичность и интероперабельность с Java.
В качестве архитектурного шаблона я выбрал MVVM (Model-View-ViewModel), поскольку он обеспечивает хорошее разделение ответственности, упрощает тестирование и улучшает поддерживаемость кода.
Для асинхронных операций и управления потоками использовались Coroutines, предоставляющие легковесное и гибкое решение для параллельного программирования на Kotlin.
Для сетевых запросов применялась библиотека Retrofit в связке с Moshi для парсинга JSON. Retrofit упрощает выполнение HTTP-запросов, а Moshi — эффективный JSON-парсер.
Управление зависимостями и их внедрение осуществлялось с помощью Hilt, надстройки над Dagger, которая упрощает настройку и использование dependency injection в Android-приложениях.
Для сохранения данных использовался Room Persistence Library, абстракция над SQLite, упрощающая работу с базами данных на Android.
Основные материалы, которые я использовал:
- Официальная документация Kotlin (kotlinlang.org)
- Официальная документация Android Developers (developer.android.com)
- Документация по используемым библиотекам (Retrofit, Moshi, Hilt, Room, Coroutines)
- Статьи и видеоуроки на ресурсах таких как Medium, ProAndroidDev, YouTube-каналы
Пример использования Coroutines:
// Запуск корутины в скоупе ViewModel
viewModelScope.launch {
// Выполнение сетевого запроса в фоновом потоке
val result = withContext(Dispatchers.IO) {
repository.getSomeData()
}
// Обновление UI в главном потоке
_data.value = result
}
Пример использования Room:
// Определение сущности Room
@Entity
data class User(
@PrimaryKey val id: Int,
val name: String
)
// Определение DAO
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): LiveData<List<User>>
@Insert
susible fun insertAll(vararg users: User)
}
// Определение базы данных
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
Архитектурный шаблон MVVM был реализован следующим образом:
- Model: Репозитории, которые абстрагируют источники данных (сеть, база данных) и предоставляют данные ViewModel.
- View: Компоненты UI (Activity, Fragment), которые отображают данные и отправляют события ViewModel.
- ViewModel: Держит состояние UI, взаимодействует с Model и предоставляет данные View через LiveData или StateFlow.
Тестирование было выполнено с использованием JUnit для модульных тестов и Mockito (для имитации зависимостей) и AndroidX Test (для инструментальных тестов).
// Пример модульного теста с JUnit и Mockito
@Test
fun `getUserData should return data from repository`() {
// Arrange
val expectedUser = User(1, "Test User")
whenever(repository.getUser(anyInt())).thenReturn(expectedUser)
// Act
val actualUser = viewModel.getUserData(1)
// Assert
assertEquals(expectedUser, actualUser)
}