СОДЕРЖАНИЕ: 00:00:00 - введение 00:0:54 - разбираем ViewModel (MVVM) 00:03:20 - пишем Юнит тест 00:06:37 - применяем Mockito 00:08:05 - Unit тест 00:25:39 - заключение
@КиемМирзоевич2 жыл бұрын
Здравствуйте , как к вам в курсы записаться?
@GliderJPA2 жыл бұрын
пытался по сайту записаться на курсы, вы работаете еще?
@MG-it7nx Жыл бұрын
Посмотрел все видео по архитектуре и хочу сказать, что, Тимофей, ты настоящий мужик и просто красавчик!) Без воды, без всякой нудятины и разглагольствований, без дурацких картинок с мемами, все четко и по делу. Жму руку!)
@jacksaf85462 жыл бұрын
просто титанический труд, видно, что человеку по кайфу то, что он делает. мало того, что учишься, еще и заряжаешься позитивным настроением от автора =)
@haykmkrtchyan70937 ай бұрын
Великолепно 🤩 Спасибо за бесплатный курс Тимофей, огромная благодарность 🙌
@azatsabirov8632 жыл бұрын
Долгожданное видео. Конечно лайк, все на уровне!
@dreamer62287512 жыл бұрын
Хорошо, что продолжается публикация видео. Спасибо за информацию.
@PavelStr-x5w10 ай бұрын
Большое спасибо за такое полезное видео ! :)
@chriswaytt60092 жыл бұрын
Тимофей шикарно объясняешь давай больше уроков, очень нравится, жаль что так мало видео.
@АлександрРоманов-р5ф2 жыл бұрын
О наконец-то, обожаю ваши видосы
@enkyinneme2 жыл бұрын
Крутое видео!Очень понятно и информативно!
@mikeshilovski15122 жыл бұрын
Один из лучших каналов
@ivanstrelka34482 жыл бұрын
Спасибо!! ты крутой 🥰
@McMouse882 жыл бұрын
Тимофей жалко что пропали, очень годный, интересный и качественный контент снимаете
@kostyachu Жыл бұрын
Спасибо!
@gazim_soliev2 жыл бұрын
Эх, а хотелось бы посмотреть тесты с suspend функциями и корутинами во ViewModel
@avada-kentaura Жыл бұрын
Используй mockk для suspend функций вместо mockito. Этого будет достаточно
@ИванДаунитис2 жыл бұрын
Добрый день, подскажите, новые видео собираетесь записывать, если да, то на какую тему, спасибо
@igornovikov63372 жыл бұрын
Тимофей, сделайте пожалуйста урок по MVI паттерну с использованием ViewModel и с обработкой side эффектов без использования сторонних библиотек типа Orbit. В сети отсутствуют хорошие туториалы, а на русском языке тем более.
@chriswaytt60092 жыл бұрын
Здравствуйте. Как вас найти на GitHub ?
@kafychannel2 жыл бұрын
Здравствуйте,спксиьо за видео! 9:16 - тогда вы будете нарушать принцип DRY
@TimofeyKovalenko2 жыл бұрын
Далеко не всегда стоит гнаться за переиспользованием кода. Часто лучше сделать незначительный копипаст, но зато иметь независимый код.
@Chybakut20042 жыл бұрын
Тимофей, спасибо большое за объяснения! Особенно важным показался нюанс, что нельзя использовать константы из кода приложения в тестах 👍 В документациях про это не пишут 😁 Однако есть вопрос не теме. Почему публичные методы ViewModel-и названы конкретными действиями (save, load), а не событиями (onSaveButtonClicked, onLoadButtonClicked)? ViewModel же должна реализовать события с View и управлять View, а с конкретными названиями методов ViewModel не реализует события, а предоставляет интерфейс для выполнения конкретных действий. И тогда, если потребуется поменять действие, вызываемое при событии, то придется отредактировать как ViewModel, так и реализацию View (вызывать другой метод ViewModel-и), что является нарушением принципа единственной ответственности у View. У её реализации теперь есть две причины для изменения - при смене дизайна, при смене бизнес-логики. Это так же потребует отредактировать существующие тесты у View. А если называть методы ViewModel-и абстрактно, то при изменении действия, которое должно вызываться при событии, придется редактировать только ViewModel. А если реализация View и затронется, то только для добавления нового кода, а не для смены старого.
@TimofeyKovalenko2 жыл бұрын
Да, все верно говорите. В примере просто упростил, что-бы не писать длинное название, но по хорошему так и нужно их называть.
@Chybakut20042 жыл бұрын
@@TimofeyKovalenko спасибо! 👍
@MihMas2 жыл бұрын
Добрый день, уважаемый Тимофей! У меня вопрос: функции ViewModel.save() и ViewModel.load() модуля App обращаются к функциям UseCase.execute() модуля Domain, а так же напрямую к моделям модуля domain. Не нарушает ли это принципы чистой архитектуры? Быть может для модуля App нужно было создать свою модель и репозиторий по аналогии с модулем Data?
@TimofeyKovalenko2 жыл бұрын
В большинстве случаев это уже избыточно. App в любом случае получит именно домейн ентити к себе, а дальше можно их замапить в UI ентити, которую вы уже доставите во view, но это необходимо только что-бы дополнительно подготовить данные для UI, например если там сложная ентити и вы хотите ее упросить, что бы View могла просто брать данные и отображать их. Про репозиторий не понял, как вы его собираетесь использовать из ViewModel?
@pumaelgatosiberian5047 Жыл бұрын
очень жаль, что нет ссылки на гитхаб
@floydoman272 жыл бұрын
Добрый день! Будет ли ещё набор на курс "Комплексный курс по Java, Kotlin и Android".
@TimofeyKovalenko2 жыл бұрын
К сожалению в этом году технически не получается заниматься преподаванием (((. Есть группа для тех, кто хочет пойти на обучение: t.me/+ecDWHDUu9ak2N2I6 Там будет информация, как только старт будет.
@mihailpalminschi2 жыл бұрын
Спасибо за уроки, хотел бы записаться на ваши курсы, но на сайте написано что мест нету. Когда будет возможно записаться?
@TimofeyKovalenko2 жыл бұрын
Да, к сожалению временно (весна 2022) студентов новых не беру. Но вы можете оставить заявку, я всех помечаю и как только, есть возможность, со всеми связываюсь.
@АлександрЗацепин-ш6ы2 жыл бұрын
Привет. На эти тесты получаю Test events were not received, а тесты для domain модуля прошли успешно. Почему эти тесты не работают?
@АндрейБаранов-ж3э2 жыл бұрын
Убедитесь, что вы прописали в build.gradle test { useJUnitPlatform() }
@ЛевШаповалов-х5в2 жыл бұрын
Продолжаете ли вы набор на ваш курс потому что на сайте написанно что мест нет. Это вы уже набрали людей и через какое то время места появятся или набор вообще закрыт?
@TimofeyKovalenko2 жыл бұрын
Время от времени появляются места. Очень много желающих, физически не могу столько принять (((.
@purplehazer4172 жыл бұрын
Привет. Сделаешь видео по модуляризации не по слоям, а по фичам? и по навигации между модулями фичей? где-то писал, что планировал такое видео
@TimofeyKovalenko2 жыл бұрын
Да, на вкладке сообщество, там как раз голосование идет, какие темы дальше разобрать.
@kafychannel2 жыл бұрын
Вы работаете андроид разработчиком? Или андроид для вас хобби, давно смотрю вас и хотелось всё время узнать)
@TimofeyKovalenko2 жыл бұрын
Конечно работаю) откуда же все это можно узнать, если не из опыта)). А преподавание - это как раз таки хобби.
@beeline092 жыл бұрын
Видео интересное, случайно наткнулся на него, но... Я один не понимал и не понимаю смысла этих тестов? Ведь простым дебагом или, на крайняк, логом, можно это все сделать. Да и как-то всё очень очевидно. Мне уже несколько лет никто толково не может объяснить их смысл. Кодинг ради кодинга? Чтоб обосновать свою зарплату? Зачем эти бессмысленные телодвижения?
@TimofeyKovalenko2 жыл бұрын
Как вы собрались использовать дебаг или логи для этого? :) Эти тесты как правило запускаются в автоматическом режиме, перед релизом приложения, после реализацию нового функционала или при каждом мердж реквесте. То есть, вы написали эти тесты и забыли про них), работаете дальше с другими задачами. Но, если случайно испортился старый код, то об этом быстро станет известно, когда тесты на сервере упадут.
@beeline092 жыл бұрын
@@TimofeyKovalenko как это как? Вы не можете отследить записалось в шэйрдпреференс что-то или нет? Ну ок, тест сломается, если кто-то куда полезет и что-то сломает в плане логики. Но почему кто-то должен что-то ломать? Я работаю в крупном проекте и мы прекрасно обходимся без тестов. Я представляю сколько моего драгоценного времени было бы потрачено впустую, если бы я ещё и тестами занимался...
@trolofoks Жыл бұрын
@@beeline09 Если проект крупный то на деле тесты сэкономят больше времени чем уйдет на их написание.
@dannyregster11202 жыл бұрын
эх думал тут с корутинками:(
@TimofeyKovalenko2 жыл бұрын
Пока еще нет, тут только базовые вещи.
@trolofoks Жыл бұрын
Кому нужны варианты с разными параметрами вот код @ParameterizedTest @ValueSource(booleans = [true, false]) fun `should try to save and return success status`(saveResult: Boolean){...}