AssertJ как способ значительно улучшить код ваших тестов
В 2019-2020 годах на одном из проектов я был идейным вдохновителем перехода на JUnit 5. Для проверок мы использовали стандартные ассерты и Hamcrest. Тогда мне казалось, что этого более чем достаточно. Один из наших lead-инженеров предлагал AssertJ как более «модное и молодёжное» решение, но поддержки эта идея не получила. Я был одним из тех, кто выступал против AssertJ. Каюсь, был грешен :)
За последние пару лет, несмотря на менеджерскую позицию, я написал свыше пятисот тестов, и мой подход к тестированию претерпел значительные изменения. В этой статье я постараюсь объяснить, почему AssertJ — это лучшее решение для проверок в тестах, существующее сегодня (год 2022 от Р.X.). Разумеется, всё ниже сказанное — это моё субъективное мнение.
https://habr.com/ru/post/675778/
👉@BookJava
В 2019-2020 годах на одном из проектов я был идейным вдохновителем перехода на JUnit 5. Для проверок мы использовали стандартные ассерты и Hamcrest. Тогда мне казалось, что этого более чем достаточно. Один из наших lead-инженеров предлагал AssertJ как более «модное и молодёжное» решение, но поддержки эта идея не получила. Я был одним из тех, кто выступал против AssertJ. Каюсь, был грешен :)
За последние пару лет, несмотря на менеджерскую позицию, я написал свыше пятисот тестов, и мой подход к тестированию претерпел значительные изменения. В этой статье я постараюсь объяснить, почему AssertJ — это лучшее решение для проверок в тестах, существующее сегодня (год 2022 от Р.X.). Разумеется, всё ниже сказанное — это моё субъективное мнение.
https://habr.com/ru/post/675778/
👉@BookJava
Хабр
AssertJ как способ значительно улучшить код ваших тестов
Привет, Хабр! В 2019-2020 годах на одном из проектов я был идейным вдохновителем перехода на JUnit 5. Для проверок мы использовали стандартные ассерты и Hamcrest. Тогда мне казалось, что этого более...
Что можно импортировать статически?
Обычный импорт избавляет от необходимости писать полное имя классов: при использовании можно не указывать пакет. Статические импорты делает то же самое, но для статических членов класса.
Самое распространенное применение статического импорта – включение констант из константных интерфейсов и статических методов из утилитарных классов. Но также можно включать и изменяемые статические поля других классов.
Отдельно интересен случай nested-класса. Он одновременно является и классом, и статическим членом другого класса. Поэтому для него работает как обычный, так и статический импорт.
Языковая конструкция
👉@BookJava
Обычный импорт избавляет от необходимости писать полное имя классов: при использовании можно не указывать пакет. Статические импорты делает то же самое, но для статических членов класса.
Самое распространенное применение статического импорта – включение констант из константных интерфейсов и статических методов из утилитарных классов. Но также можно включать и изменяемые статические поля других классов.
Отдельно интересен случай nested-класса. Он одновременно является и классом, и статическим членом другого класса. Поэтому для него работает как обычный, так и статический импорт.
Языковая конструкция
static import
обязана располагаться там же, где и обычные импорты – обязательно между package
и объявлением основного класса файла.👉@BookJava
Нельзя так просто взять и вычислить абсолютное значение
Кажется, задача вычисления абсолютного значения (или модуля) числа совершенно тривиальна. Если число отрицательно, давайте сменим знак. Иначе оставим как есть. На Java это будет выглядеть примерно так:
https://bookflow.ru/nelzya-tak-prosto-vzyat-i-vychislit-absolyutnoe-znachenie/
👉@BookJava
Кажется, задача вычисления абсолютного значения (или модуля) числа совершенно тривиальна. Если число отрицательно, давайте сменим знак. Иначе оставим как есть. На Java это будет выглядеть примерно так:
public static double abs(double value) {
if (value < 0) {
return -value;
}
return value;
}
https://bookflow.ru/nelzya-tak-prosto-vzyat-i-vychislit-absolyutnoe-znachenie/
👉@BookJava
Как использовать ReadWriteLock?
Стандартный интерфейс
Оба типа блокировок одного экземпляра
Свойства этих локов защищают программу от ситуаций конкурентной записи ресурса и чтения во время записи. Подобно copy-on-write коллекциям, этот подход становится выгодным, когда ресурс читают сильно чаще чем модифицируют.
Интерфейс реализуется классом
👉@BookJava
Стандартный интерфейс
ReadWriteLock
предоставляет потокобезопасный разделенный доступ на чтение и на запись. Для этих целей в нём объявлены два метода: readLock()
и writeLock()
. Они возвращают объекты под интерфейсом Lock.Оба типа блокировок одного экземпляра
ReadWriteLock
связаны. Пока какой-то поток не заберет блокировку на запись, сколько угодно потоков могут читать не мешая друг другу. Блокировкой readLock
закрывается часть кода с семантикой «только чтения» некоторого условного «ресурса». В критической секции кода writeLock
осуществляется модификация ресурса.Свойства этих локов защищают программу от ситуаций конкурентной записи ресурса и чтения во время записи. Подобно copy-on-write коллекциям, этот подход становится выгодным, когда ресурс читают сильно чаще чем модифицируют.
Интерфейс реализуется классом
ReentrantReadWriteLock
, который во многом похож на обычный ReentrantLock.👉@BookJava
Сравнение виртуальных и обычных потоков в Java
Я люблю стректрейсы и понятный линейный код. И соответственно не люблю реактивщину. Все примеры будут нереактивными с последовательным понятным кодом.
https://habr.com/ru/post/676084/
👉@BookJava
Я люблю стректрейсы и понятный линейный код. И соответственно не люблю реактивщину. Все примеры будут нереактивными с последовательным понятным кодом.
https://habr.com/ru/post/676084/
👉@BookJava
Media is too big
VIEW IN TELEGRAM
Фантастические баги и где они обитают
Интерактивный мастер-класс по Java, на котором Юрий Пеньков, senior java-разработчик, рассказал о хитростях написания кода, неожиданных результатах выполнения, объяснил на примерах неочевидные моменты языка.
👉@BookJava
Интерактивный мастер-класс по Java, на котором Юрий Пеньков, senior java-разработчик, рассказал о хитростях написания кода, неожиданных результатах выполнения, объяснил на примерах неочевидные моменты языка.
👉@BookJava
Перечислите стандартные функциональные интерфейсы
Стандартная библиотека содержит пакет java.util.function, в котором хранятся функциональные интерфейсы для большинства случаев жизни. Их можно разделить на 5 групп:
Функции
Обычная обобщенная функция – интерфейс Function<T, R>. Принимает параметр и возвращает значение другого типа. Для примитивов есть не-generic специализации – семейство интерфейсов XtoYFunction. (Здесь и далее вместо X и Y подставляются названия примитивов).
Бинарные функции – функции с двумя параметрами и возвращаемым значением. BiFunction<T, U, R>, ToXBiFunction<T, U>.
Поставщики (Suppliers)
Интерфейсы Supplier<T>, XSupplier – не принимают ничего, возвращают (поставляют) значение.
Потребители (Consumers)
Consumer<T>, XConsumer – принимают (потребляют) значение, ничего не возвращают.
Бинарный вариант, BiConsumer<T, U> и XYConsumer, потребляет два параметра.
Предикаты
Predicate<T>, XPredicate – принимают параметр, возвращают boolean. Кроме самой функции содержат дефолтные реализации логических операций.
Операторы
Унарный (UnaryOperator<T>) и бинарный (BinaryOperator<T>) – просто функция и би-функция с одинаковым типом параметров и результата. Специализации для примитивов XUnaryOperator и XBinaryOperator вдобавок содержат дефолтные реализации методов для композиции операторов.
👉@BookJava
Стандартная библиотека содержит пакет java.util.function, в котором хранятся функциональные интерфейсы для большинства случаев жизни. Их можно разделить на 5 групп:
Функции
Обычная обобщенная функция – интерфейс Function<T, R>. Принимает параметр и возвращает значение другого типа. Для примитивов есть не-generic специализации – семейство интерфейсов XtoYFunction. (Здесь и далее вместо X и Y подставляются названия примитивов).
Бинарные функции – функции с двумя параметрами и возвращаемым значением. BiFunction<T, U, R>, ToXBiFunction<T, U>.
Поставщики (Suppliers)
Интерфейсы Supplier<T>, XSupplier – не принимают ничего, возвращают (поставляют) значение.
Потребители (Consumers)
Consumer<T>, XConsumer – принимают (потребляют) значение, ничего не возвращают.
Бинарный вариант, BiConsumer<T, U> и XYConsumer, потребляет два параметра.
Предикаты
Predicate<T>, XPredicate – принимают параметр, возвращают boolean. Кроме самой функции содержат дефолтные реализации логических операций.
Операторы
Унарный (UnaryOperator<T>) и бинарный (BinaryOperator<T>) – просто функция и би-функция с одинаковым типом параметров и результата. Специализации для примитивов XUnaryOperator и XBinaryOperator вдобавок содержат дефолтные реализации методов для композиции операторов.
👉@BookJava
Method overloading in the JVM
https://www.infoworld.com/article/3268983/java-challengers-1-method-overloading-in-the-jvm.html
👉@BookJava
https://www.infoworld.com/article/3268983/java-challengers-1-method-overloading-in-the-jvm.html
👉@BookJava
Как выбрать все элементы определенного каталога по критерию (например, с определенным расширением)?
Метод
👉@BookJava
Метод
File.listFiles
возвращает массив объектов File, содержащихся в каталоге. Метод может принимать в качестве параметра объект класса, реализующего FileFilter
. Это позволяет включить в список только те элементы, для которых метод accept возвращает true (критерием может быть длина имени файла или его расширение).👉@BookJava
Может ли Java-приложение использовать больше памяти, чем размер кучи
https://www.baeldung.com/java-memory-beyond-heap
👉@BookJava
https://www.baeldung.com/java-memory-beyond-heap
👉@BookJava
Baeldung
Can a Java Application Use More Memory Than the Heap Size? | Baeldung
Learn how to restrict the total memory usage in Java.
Backend на Java: большой курс для входа в профессию backend-разработчика
1 Занятие: Программа курса. Основы —уроки Backend-разработки на Java
2 Занятие: Основы ООП java— Backend-разработка на Java-B
3 Занятие: Продвинутый ООП java— Backend-разработка на JavaB
4 Занятие: Многопоточность в java— Backend-разработка на Java
5 занятие: Введение в Spring, Beans, Контекст, Внедрение зависимостей — Backend на Java
6 занятие: Введение в Spring. Spring Boot — Backend-разработка на JavaB
GIT ДЛЯ РАЗРАБОТЧИКА. Урок по гиту для начинающих— Обзор системы контроля версийB
7 занятие: Spring MVC. Контроллеры и жизненный цикл бинов— Backend-разработка на Java
Коллекции в Java | Java Collections — вебинар в рамках курса Backend- разработки на Java
8 занятие: Доступ к данным, Hibernate основы— Backend-разработка на JavaBr
8.2 занятие: Доступ к данным, отношения сущностей — Backend-разработка на Java
9 Занятие: Как работать с транзакциями, уровнями изоляции | ACID — уроки Backend-разработки на Java
10 занятие: Spring Rest CRUD операции. Репозитории - Backend-разработка на Java
Вебинар: Регистрация Авторизация Аутентификация Spring Security - Backend-разработка на Java
11 занятие: AOP Аспектно-ориентированное программирование — Backend-разработка на Java
Вебинар: Docker — Как работать с контейнерами? — Backend-разработка на Java
Что такое Java Garbage Collector, Как работает сборщик мусора в Java?
Erlang Elixir Phoenix — Экскурсия по пути герояBrain
Собеседование Java Spring - Разбор вопросов с собеседований на Java Developer
Докер — Что нужно знать? Контейнеризация с Docker для разработчиковBrai
Apache Kafka — Брокер сообщений для вашего Backend-аBrains
источник
👉@BookJava
1 Занятие: Программа курса. Основы —уроки Backend-разработки на Java
2 Занятие: Основы ООП java— Backend-разработка на Java-B
3 Занятие: Продвинутый ООП java— Backend-разработка на JavaB
4 Занятие: Многопоточность в java— Backend-разработка на Java
5 занятие: Введение в Spring, Beans, Контекст, Внедрение зависимостей — Backend на Java
6 занятие: Введение в Spring. Spring Boot — Backend-разработка на JavaB
GIT ДЛЯ РАЗРАБОТЧИКА. Урок по гиту для начинающих— Обзор системы контроля версийB
7 занятие: Spring MVC. Контроллеры и жизненный цикл бинов— Backend-разработка на Java
Коллекции в Java | Java Collections — вебинар в рамках курса Backend- разработки на Java
8 занятие: Доступ к данным, Hibernate основы— Backend-разработка на JavaBr
8.2 занятие: Доступ к данным, отношения сущностей — Backend-разработка на Java
9 Занятие: Как работать с транзакциями, уровнями изоляции | ACID — уроки Backend-разработки на Java
10 занятие: Spring Rest CRUD операции. Репозитории - Backend-разработка на Java
Вебинар: Регистрация Авторизация Аутентификация Spring Security - Backend-разработка на Java
11 занятие: AOP Аспектно-ориентированное программирование — Backend-разработка на Java
Вебинар: Docker — Как работать с контейнерами? — Backend-разработка на Java
Что такое Java Garbage Collector, Как работает сборщик мусора в Java?
Erlang Elixir Phoenix — Экскурсия по пути герояBrain
Собеседование Java Spring - Разбор вопросов с собеседований на Java Developer
Докер — Что нужно знать? Контейнеризация с Docker для разработчиковBrai
Apache Kafka — Брокер сообщений для вашего Backend-аBrains
источник
👉@BookJava