Юнит тест для View Model в Android

Sdílet
Vložit
  • čas přidán 2. 07. 2024
  • Показываю на практике, как написать Юнит тест для View Model в Android с нуля. Разбираем реальный пример с MVVM в архитектуре Clean Architecture (Чистая архитектура).
    Домашние задания c проверкой, созвоны один на один доступны в рамках курса по java, kotlin, android на: ✅ KIPARO.COM.
    СОДЕРЖАНИЕ:
    -------------------------------------------------------------------
    00:00:00 - введение
    00:0:54 - разбираем ViewModel (MVVM)
    00:03:20 - пишем Юнит тест
    00:06:37 - применяем Mockito
    00:08:05 - Unit тест
    00:25:39 - заключение
    -------------------------------------------------------------------
    На канале также есть и другие уроки по программированию.
    Так же, найти меня можно вот тут:
    ✅ Linkedin: / timofeykovalenko
    ✅ Instagram: / ttimofey
    ✅ На моем сайте: kiparo.com
    ✅ FB с анонсами видео: / kiparocom
    #viewmodel #android #kiparo

Komentáře • 49

  • @TimofeyKovalenko
    @TimofeyKovalenko  Před 2 lety +5

    СОДЕРЖАНИЕ:
    00:00:00 - введение
    00:0:54 - разбираем ViewModel (MVVM)
    00:03:20 - пишем Юнит тест
    00:06:37 - применяем Mockito
    00:08:05 - Unit тест
    00:25:39 - заключение

    • @user-co8nf2tw3m
      @user-co8nf2tw3m Před 2 lety

      Здравствуйте , как к вам в курсы записаться?

    • @GliderJPA
      @GliderJPA Před rokem

      пытался по сайту записаться на курсы, вы работаете еще?

  • @jacksaf8546
    @jacksaf8546 Před 2 lety +10

    просто титанический труд, видно, что человеку по кайфу то, что он делает. мало того, что учишься, еще и заряжаешься позитивным настроением от автора =)

  • @haykmkrtchyan7093
    @haykmkrtchyan7093 Před 4 dny

    Великолепно 🤩 Спасибо за бесплатный курс Тимофей, огромная благодарность 🙌

  • @MG-it7nx
    @MG-it7nx Před 5 měsíci +1

    Посмотрел все видео по архитектуре и хочу сказать, что, Тимофей, ты настоящий мужик и просто красавчик!) Без воды, без всякой нудятины и разглагольствований, без дурацких картинок с мемами, все четко и по делу. Жму руку!)

  • @azatsabirov863
    @azatsabirov863 Před 2 lety

    Долгожданное видео.
    Конечно лайк, все на уровне!

  • @dreamer6228751
    @dreamer6228751 Před 2 lety

    Хорошо, что продолжается публикация видео. Спасибо за информацию.

  • @user-lx1sp4ju3e
    @user-lx1sp4ju3e Před 2 lety

    О наконец-то, обожаю ваши видосы

  • @user-we6si4mi3x
    @user-we6si4mi3x Před 2 měsíci

    Большое спасибо за такое полезное видео ! :)

  • @user-zk1dd3zp9b
    @user-zk1dd3zp9b Před rokem

    Крутое видео!Очень понятно и информативно!

  • @ivanstrelka3448
    @ivanstrelka3448 Před rokem

    Спасибо!! ты крутой 🥰

  • @mikeshilovski1512
    @mikeshilovski1512 Před rokem

    Один из лучших каналов

  • @chriswaytt6009
    @chriswaytt6009 Před rokem

    Тимофей шикарно объясняешь давай больше уроков, очень нравится, жаль что так мало видео.

  • @kostyachu
    @kostyachu Před rokem

    Спасибо!

  • @McMouse88
    @McMouse88 Před 2 lety

    Тимофей жалко что пропали, очень годный, интересный и качественный контент снимаете

  • @gazim_soliev
    @gazim_soliev Před 2 lety +6

    Эх, а хотелось бы посмотреть тесты с suspend функциями и корутинами во ViewModel

    • @avada-kentaura
      @avada-kentaura Před 6 měsíci

      Используй mockk для suspend функций вместо mockito. Этого будет достаточно

  • @igornovikov6337
    @igornovikov6337 Před 2 lety +2

    Тимофей, сделайте пожалуйста урок по MVI паттерну с использованием ViewModel и с обработкой side эффектов без использования сторонних библиотек типа Orbit. В сети отсутствуют хорошие туториалы, а на русском языке тем более.

  • @kafychannel
    @kafychannel Před 2 lety +1

    Здравствуйте,спксиьо за видео! 9:16 - тогда вы будете нарушать принцип DRY

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 2 lety

      Далеко не всегда стоит гнаться за переиспользованием кода. Часто лучше сделать незначительный копипаст, но зато иметь независимый код.

  • @user-qh6dp3rr4r
    @user-qh6dp3rr4r Před rokem

    Добрый день, подскажите, новые видео собираетесь записывать, если да, то на какую тему, спасибо

  • @Chybakut2004
    @Chybakut2004 Před rokem

    Тимофей, спасибо большое за объяснения! Особенно важным показался нюанс, что нельзя использовать константы из кода приложения в тестах 👍 В документациях про это не пишут 😁
    Однако есть вопрос не теме. Почему публичные методы ViewModel-и названы конкретными действиями (save, load), а не событиями (onSaveButtonClicked, onLoadButtonClicked)? ViewModel же должна реализовать события с View и управлять View, а с конкретными названиями методов ViewModel не реализует события, а предоставляет интерфейс для выполнения конкретных действий. И тогда, если потребуется поменять действие, вызываемое при событии, то придется отредактировать как ViewModel, так и реализацию View (вызывать другой метод ViewModel-и), что является нарушением принципа единственной ответственности у View. У её реализации теперь есть две причины для изменения - при смене дизайна, при смене бизнес-логики. Это так же потребует отредактировать существующие тесты у View. А если называть методы ViewModel-и абстрактно, то при изменении действия, которое должно вызываться при событии, придется редактировать только ViewModel. А если реализация View и затронется, то только для добавления нового кода, а не для смены старого.

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před rokem +1

      Да, все верно говорите. В примере просто упростил, что-бы не писать длинное название, но по хорошему так и нужно их называть.

    • @Chybakut2004
      @Chybakut2004 Před rokem

      @@TimofeyKovalenko спасибо! 👍

  • @purplehazer417
    @purplehazer417 Před 2 lety

    Привет. Сделаешь видео по модуляризации не по слоям, а по фичам? и по навигации между модулями фичей? где-то писал, что планировал такое видео

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 2 lety

      Да, на вкладке сообщество, там как раз голосование идет, какие темы дальше разобрать.

  • @MihMas
    @MihMas Před rokem

    Добрый день, уважаемый Тимофей! У меня вопрос: функции ViewModel.save() и ViewModel.load() модуля App обращаются к функциям UseCase.execute() модуля Domain, а так же напрямую к моделям модуля domain. Не нарушает ли это принципы чистой архитектуры? Быть может для модуля App нужно было создать свою модель и репозиторий по аналогии с модулем Data?

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před rokem +1

      В большинстве случаев это уже избыточно. App в любом случае получит именно домейн ентити к себе, а дальше можно их замапить в UI ентити, которую вы уже доставите во view, но это необходимо только что-бы дополнительно подготовить данные для UI, например если там сложная ентити и вы хотите ее упросить, что бы View могла просто брать данные и отображать их.
      Про репозиторий не понял, как вы его собираетесь использовать из ViewModel?

  • @mihailpalminschi
    @mihailpalminschi Před 2 lety +1

    Спасибо за уроки, хотел бы записаться на ваши курсы, но на сайте написано что мест нету. Когда будет возможно записаться?

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 2 lety +1

      Да, к сожалению временно (весна 2022) студентов новых не беру. Но вы можете оставить заявку, я всех помечаю и как только, есть возможность, со всеми связываюсь.

  • @floydoman27
    @floydoman27 Před rokem

    Добрый день! Будет ли ещё набор на курс "Комплексный курс по Java, Kotlin и Android".

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před rokem

      К сожалению в этом году технически не получается заниматься преподаванием (((. Есть группа для тех, кто хочет пойти на обучение:
      t.me/+ecDWHDUu9ak2N2I6
      Там будет информация, как только старт будет.

  • @user-cq3qw3to5t
    @user-cq3qw3to5t Před 2 lety

    Продолжаете ли вы набор на ваш курс потому что на сайте написанно что мест нет. Это вы уже набрали людей и через какое то время места появятся или набор вообще закрыт?

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 2 lety

      Время от времени появляются места. Очень много желающих, физически не могу столько принять (((.

  • @kafychannel
    @kafychannel Před 2 lety +1

    Вы работаете андроид разработчиком? Или андроид для вас хобби, давно смотрю вас и хотелось всё время узнать)

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 2 lety

      Конечно работаю) откуда же все это можно узнать, если не из опыта)). А преподавание - это как раз таки хобби.

  • @chriswaytt6009
    @chriswaytt6009 Před rokem

    Здравствуйте. Как вас найти на GitHub ?

  • @user-kh5wy3ou9l
    @user-kh5wy3ou9l Před 2 lety

    Привет. На эти тесты получаю Test events were not received, а тесты для domain модуля прошли успешно. Почему эти тесты не работают?

    • @user-cn1eq6et1i
      @user-cn1eq6et1i Před rokem

      Убедитесь, что вы прописали в build.gradle
      test {
      useJUnitPlatform()
      }

  • @pumaelgatosiberian5047

    очень жаль, что нет ссылки на гитхаб

  • @dannyregster1120
    @dannyregster1120 Před 2 lety

    эх думал тут с корутинками:(

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 2 lety

      Пока еще нет, тут только базовые вещи.

  • @beeline09
    @beeline09 Před rokem +1

    Видео интересное, случайно наткнулся на него, но... Я один не понимал и не понимаю смысла этих тестов? Ведь простым дебагом или, на крайняк, логом, можно это все сделать. Да и как-то всё очень очевидно. Мне уже несколько лет никто толково не может объяснить их смысл. Кодинг ради кодинга? Чтоб обосновать свою зарплату? Зачем эти бессмысленные телодвижения?

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před rokem

      Как вы собрались использовать дебаг или логи для этого? :)
      Эти тесты как правило запускаются в автоматическом режиме, перед релизом приложения, после реализацию нового функционала или при каждом мердж реквесте. То есть, вы написали эти тесты и забыли про них), работаете дальше с другими задачами. Но, если случайно испортился старый код, то об этом быстро станет известно, когда тесты на сервере упадут.

    • @beeline09
      @beeline09 Před rokem

      @@TimofeyKovalenko как это как? Вы не можете отследить записалось в шэйрдпреференс что-то или нет? Ну ок, тест сломается, если кто-то куда полезет и что-то сломает в плане логики. Но почему кто-то должен что-то ломать? Я работаю в крупном проекте и мы прекрасно обходимся без тестов. Я представляю сколько моего драгоценного времени было бы потрачено впустую, если бы я ещё и тестами занимался...

    • @trolofoks9336
      @trolofoks9336 Před 11 měsíci

      @@beeline09 Если проект крупный то на деле тесты сэкономят больше времени чем уйдет на их написание.

  • @trolofoks9336
    @trolofoks9336 Před 11 měsíci

    Кому нужны варианты с разными параметрами вот код
    @ParameterizedTest
    @ValueSource(booleans = [true, false])
    fun `should try to save and return success status`(saveResult: Boolean){...}