Media is too big
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Аутентификация - Spring Security в деталях
Получение информации о пользователе - Spring Security в деталях
Ещё один способ получения аутентифицированного пользователя #java #springsecurity
Точки входа аутентификации - Spring Security в деталях
Источники информации о пользователях - Spring Security в деталях
Устаревшие DSL в Spring Security 6.1
Отладка контекста безопасности - Spring Security в деталях
DSL и конфигураторы контекста безопасности - Spring Security в деталях
Фильтры безопасности - Spring Security в деталях
📌 источник
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20 приемов кода Java, которые помогут повысить вашу производительность
1. Используйте расширенный цикл for.
Расширенный цикл for, также известный как цикл for-each, позволяет перебирать массивы или коллекции без ручного управления индексами. Это упрощает код и делает его более читабельным. Взглянем на пример:
i
Stream API, представленный в Java 8, расширяет возможности при выполнении операций обработки коллекций. Он позволяет выполнять такие действия, как фильтрация, сопоставление и сокращение, более лаконичным образом. Потоки могут улучшить читаемость кода и уменьшить количество шаблонов. Например:
3. Пользуйтесь преимуществом ключевого слова var (Java 10+).
Ключевое слово var позволяет вам объявлять переменные с неявным выводом типа. Это уменьшает потребность в явном указании типов, делая код более кратким. Еще один пример кода:
4. Используйте StringBuilder для эффективного объединения строк.
При объединении нескольких строк использование класса StringBuilder более эффективно, чем многократное использование оператора v+. StringBuilder позволяет избежать создания ненужных объектов и обеспечивает более высокую производительность. Взгляните на этот код:
5. Применяйте тернарный оператор для кратких условных выражений.
Тернарный оператор
При работе с ресурсами, которые реализуют интерфейс
Оператор ромба (
8. Используйте пакет java.time для операций с датой и временем.
В Java 8 появился пакет java.time, который предоставляет более полный и интуитивно понятный API для работы с датой и временем. Он предлагает такие классы, как
9. Применяйте ссылки на методы.
Ссылки на методы позволяют обращаться к методу по его имени, не вызывая его. Они могут сделать ваш код более лаконичным и выразительным, особенно при работе с функциональными интерфейсами. Например:
10. Используйте методы по умолчанию (default) в интерфейсах.
Начиная с Java 8, интерфейсы могут иметь методы по умолчанию, которые обеспечивают реализацию по умолчанию (default-реализацию). Методы по умолчанию позволяют добавлять в интерфейсы новые методы, не нарушая существующие реализации. Они могут быть удобны для добавления служебных методов к интерфейсам или обеспечения поведения по умолчанию.
#junior
📌 Читать дальше
@javatg
1. Используйте расширенный цикл for.
Расширенный цикл for, также известный как цикл for-each, позволяет перебирать массивы или коллекции без ручного управления индексами. Это упрощает код и делает его более читабельным. Взглянем на пример:
i
nt[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
// Делаем что-то с number
}
2. Используйте Java Stream API.Stream API, представленный в Java 8, расширяет возможности при выполнении операций обработки коллекций. Он позволяет выполнять такие действия, как фильтрация, сопоставление и сокращение, более лаконичным образом. Потоки могут улучшить читаемость кода и уменьшить количество шаблонов. Например:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.filter(n -> n % 2 == 0)
.mapToInt(n -> n)
.sum();
3. Пользуйтесь преимуществом ключевого слова var (Java 10+).
Ключевое слово var позволяет вам объявлять переменные с неявным выводом типа. Это уменьшает потребность в явном указании типов, делая код более кратким. Еще один пример кода:
var message = "Hello, world!";
var numbers = List.of(1, 2, 3, 4, 5);
4. Используйте StringBuilder для эффективного объединения строк.
При объединении нескольких строк использование класса StringBuilder более эффективно, чем многократное использование оператора v+. StringBuilder позволяет избежать создания ненужных объектов и обеспечивает более высокую производительность. Взгляните на этот код:
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("world");
String result = sb.toString();
5. Применяйте тернарный оператор для кратких условных выражений.
Тернарный оператор
(?
🙂
позволяет записывать простые условные выражения в компактной форме. Это может быть полезно для присвоения значений или выполнения простой логики ветвления. Например:int x = 10;
String message = (x > 5) ? "Greater than 5" : "Less than or equal to 5";
6. Используйте try-with-resources для автоматического управления ресурсами.При работе с ресурсами, которые реализуют интерфейс
AutoCloseable
, такими как файловые потоки или соединения с базой данных, лучше использовать оператор try-with-resources, чтобы обеспечить надлежащую очистку ресурсов, не закрывая их явным образом. Посмотрите на пример кода:try (FileWriter writer = new FileWriter("myfile.txt")) {
//Запись в файл
}
7. Используйте оператор ромба для вывода типа.Оператор ромба (
<>
) позволяет опустить аргументы типа при создании экземпляра универсального класса, если тип можно вывести из контекста присваивания. Это уменьшает избыточность и делает код чище. Например:List<String> names = new ArrayList<>(); // Определение типа для ArrayList
8. Используйте пакет java.time для операций с датой и временем.
В Java 8 появился пакет java.time, который предоставляет более полный и интуитивно понятный API для работы с датой и временем. Он предлагает такие классы, как
LocalDate
, LocalTime
, LocalDateTime
и Duration, которые упрощают общие операции с датой и временем.9. Применяйте ссылки на методы.
Ссылки на методы позволяют обращаться к методу по его имени, не вызывая его. Они могут сделать ваш код более лаконичным и выразительным, особенно при работе с функциональными интерфейсами. Например:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println); // Ссылка на метод System.out.println
10. Используйте методы по умолчанию (default) в интерфейсах.
Начиная с Java 8, интерфейсы могут иметь методы по умолчанию, которые обеспечивают реализацию по умолчанию (default-реализацию). Методы по умолчанию позволяют добавлять в интерфейсы новые методы, не нарушая существующие реализации. Они могут быть удобны для добавления служебных методов к интерфейсам или обеспечения поведения по умолчанию.
#junior
📌 Читать дальше
@javatg
🟡 Дайджест полезных материалов из мира java за неделю
Почитать:
— Поднимаем кластер PostgreSQL в Docker и Testcontainers
— Исчерпывающее руководство по одномерным массивам в Java
— Новый взгляд на Maven-plugin для IDEA — GMaven
— Kafka UI краткий гайд
— Пошушукаемся о Барбаре Лисков или раз и навсегда запоминаем принцип подстановки
— Список популярных утечек с GitHub: Анализ репозиториев компаний
— Java Digest #3
— Из кладовщика в разработчики
— Использование Kotlin и WebFlux для выполнения задач ML в Apache Spark на GPU
— Свойство типа Controller Service в кастомном процессоре NiFi
— Опыт Сдачи: Oracle Certified Professional: Java SE 11 Developer 1Z0-819
— Get URL pointed Resource Information in Java
— GPT me liste 10 exercicios...
— How to Install JDK for Debian using ARM64: Fixing 'dpkg: error: archive 'jdk-20.0.2' is not a regular file'
— 3 Ways to Make Your API Beautiful
— A beginner-friendly design patterns masterclass
— Product of Array Except Self - LeetCode Java Solution
— Two Sum — LeetCode Java Solution
— Valid Anagram - LeetCode Java Solution
— Contains Duplicate - LeetCode Java Solution
— In Java ein Word-Dokument in ein verschlüsseltes PDF-Dokument umwandeln
Посмотреть:
🌐Why They Called It Java | Prime Reacts
Хорошего дня!
❤️ Лайк, если полезно
@javatg
Почитать:
— Поднимаем кластер PostgreSQL в Docker и Testcontainers
— Исчерпывающее руководство по одномерным массивам в Java
— Новый взгляд на Maven-plugin для IDEA — GMaven
— Kafka UI краткий гайд
— Пошушукаемся о Барбаре Лисков или раз и навсегда запоминаем принцип подстановки
— Список популярных утечек с GitHub: Анализ репозиториев компаний
— Java Digest #3
— Из кладовщика в разработчики
— Использование Kotlin и WebFlux для выполнения задач ML в Apache Spark на GPU
— Свойство типа Controller Service в кастомном процессоре NiFi
— Опыт Сдачи: Oracle Certified Professional: Java SE 11 Developer 1Z0-819
— Get URL pointed Resource Information in Java
— GPT me liste 10 exercicios...
— How to Install JDK for Debian using ARM64: Fixing 'dpkg: error: archive 'jdk-20.0.2' is not a regular file'
— 3 Ways to Make Your API Beautiful
— A beginner-friendly design patterns masterclass
— Product of Array Except Self - LeetCode Java Solution
— Two Sum — LeetCode Java Solution
— Valid Anagram - LeetCode Java Solution
— Contains Duplicate - LeetCode Java Solution
— In Java ein Word-Dokument in ein verschlüsseltes PDF-Dokument umwandeln
Посмотреть:
🌐Why They Called It Java | Prime Reacts
Хорошего дня!
❤️ Лайк, если полезно
@javatg
Вопросы-ответы собеседования
1. Что такое статический блок инициализации? static инициализатор
2. Что такое статический вложенный класс? static nested class
3. Какие типы ссылок есть в Java? Что такое Strong, Soft, Weak, Phantom Reference?
4. Что такое Strong Reference? Как работает сильная ссылка?
5. Что такое Soft Reference? Как работает мягкая ссылка?
6. Что такое Weak Reference? Как работает слабая ссылка?
7. Что такое Phantom Reference? Как работает фантомная ссылка?
8. Чем отличается интерфейс от абстрактного класса? Что использовать?
9. Что такое String Pool? Как работает пул строк?
10. Что такое пул строк? Изучаем String Pool за 50 секунд!
#video #java
https://www.youtube.com/watch?v=onDWBO2CYKY&list=PLvalLeYySoeC9i2KLvq1af7P6CllrsBsm&ab_channel=Javangelion%7C%D0%94%D0%B6%D0%B0%D0%B2%D0%B0%D0%BD%D0%B3%D0%B5%D0%BB%D0%B8%D0%BE%D0%BD
@javatg
1. Что такое статический блок инициализации? static инициализатор
2. Что такое статический вложенный класс? static nested class
3. Какие типы ссылок есть в Java? Что такое Strong, Soft, Weak, Phantom Reference?
4. Что такое Strong Reference? Как работает сильная ссылка?
5. Что такое Soft Reference? Как работает мягкая ссылка?
6. Что такое Weak Reference? Как работает слабая ссылка?
7. Что такое Phantom Reference? Как работает фантомная ссылка?
8. Чем отличается интерфейс от абстрактного класса? Что использовать?
9. Что такое String Pool? Как работает пул строк?
10. Что такое пул строк? Изучаем String Pool за 50 секунд!
#video #java
https://www.youtube.com/watch?v=onDWBO2CYKY&list=PLvalLeYySoeC9i2KLvq1af7P6CllrsBsm&ab_channel=Javangelion%7C%D0%94%D0%B6%D0%B0%D0%B2%D0%B0%D0%BD%D0%B3%D0%B5%D0%BB%D0%B8%D0%BE%D0%BD
@javatg
Выпуск версии Java 8 стал знаменательным событием в истории Java. В нем были представлены потоки данных (англ. Streams) и лямбда-выражения, которые сейчас широко применяются. Если вы не знакомы с потоками данных или никогда не слышали о них, то ничего страшного. В большинстве случаев можно обойтись без них, задействуя циклы.
И зачем тогда, спрашивается, нужны потоки данных? Есть ли у них преимущества перед циклами? Могут ли они их заменить? В статье мы изучим соответствующий код, сравним производительность и посмотрим, смогут ли потоки данных стать полноценной заменой циклов.
Сравнение кода
Потоки данных увеличивают сложность кода, поскольку им нужны классы, интерфейсы и импорт. В отличие от них, циклы изначально встроены. В каких-то случаях это действительно так, но не всегда. Сложность кода не сводится только к объемам требуемых знаний для его понимания. В большей мере она определяется степенью читаемости кода. Обратимся к примерам.
Список имен элементов с заданным типом
Допустим, у нас есть список элементов, и нужно получить список имен элементов с заданным типом. Используя циклы, пишем следующий код:
List<String> getItemNamesOfType(List<Item> items, Item.Type type) {
List<String> itemNames = new ArrayList<>();
for (Item item : items) {
if (item.type() == type) {
itemNames.add(item.name());
}
}
return itemNames;
}
Читаем код и видим, что требуется создать новый ArrayList и в каждом цикле выполнять проверку типов и вызов add(). Теперь посмотрим, как с этой же задачей справляется поток данных:
List<String> getItemNamesOfTypeStream(List<Item> items, Item.Type type) {
return items.stream()
.filter(item -> item.type() == type)
.map(item -> item.name())
.toList();
}
С помощью лямбда-выражения сразу становится понятно, что мы сначала выбираем элементы с заданным типом, а затем получаем список имен отфильтрованных элементов. В таком варианте кода построчный поток хорошо согласуется с логическим потоком.
Генерация случайного списка
Переходим к другому примеру. В следующих разделах мы рассмотрим ключевые методы потоков данных и сравним время их выполнения с циклами. Для этого потребуется случайный список Item. Ниже представлен фрагмент кода со статическим методом, который генерирует такой список:
public record Item(Type type, String name) {
public enum Type {
WEAPON, ARMOR, HELMET, GLOVES, BOOTS,
}
private static final Random random = new Random();
private static final String[] NAMES = {
"beginner",
"knight",
"king",
"dragon",
};
public static Item random() {
return new Item(
Type.values()[random.nextInt(Type.values().length)],
NAMES[random.nextInt(NAMES.length)]);
}
}
Теперь создаем случайный список Item с помощью циклов. Пишем следующий код:
List<Item> items = new ArrayList<>(100);
for (int i = 0; i < 100; i++) {
items.add(Item.random());
}
Код с потоками данных выглядит следующим образом:
List<Item> items = Stream.generate(Item::random).limit(length).toList();
Превосходный и легко читаемый код. Более того, List, возвращаемый методом toList(), представляет собой неизменяемый список. Так что вы можете пользоваться неизменяемостью List и размещать его в любых местах кода, не беспокоясь о побочных эффектах. Такой подход снижает вероятность появления ошибок в коде и облегчает его понимание.
Потоки данных предоставляют множество полезных методов, способствующих написанию лаконичного кода. Перечислим самые востребованные из них:
allMatch();
anyMatch();
count();
filter();
findFirst();
forEach();
map();
reduce();
sorted();
limit()
и многие другие методы, с описанием которых можно ознакомиться по ссылке на документацию Stream Javadoc.
Производительность
При обычных обстоятельствах потоки данных ведут себя как циклы и практически не влияют на время выполнения. Сравним основные варианты поведения потоков с реализацией циклов.
📌Читать дальше
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
ТОП 20 ТЕСТОВЫХ ЗАДАНИЙ НА ИНТЕРВЬЮ ДЛЯ JAVA РАЗРАБОТЧИКА
https://itvdn.com/ru/blog/article/test-java-20#17
@javatg
https://itvdn.com/ru/blog/article/test-java-20#17
@javatg
ITVDN
ТОП 20 тестовых заданий на интервью для Java разработчика
В этой статье мы приведем достаточно большое количество примеров программ из тех, что просят написать соискателей во время прохождения интервью на вакансию Java разработчика. Указанные тестовые задания мы приводим с реальными примерами кода, заданными в…
🟡 Дайджест полезных материалов из мира: Java за неделю
Почитать:
— Как скомпилировать Spring Boot приложение в native image с помощью GraalVm и развернуть его с помощью Docker
— Объяснения по шардинга баз данных
— Синхронизация в Java, часть 1: состояния гонки, блокировки и условия
— Как задеплоить монолитный pet проект на Java с 0 и не сойти с ума… Часть 1
— Авторизация в Spring Boot приложении с Spring Security 3.1.0 и PostgreSQL
— Ракету пустил и забыл. Или как заставить DI работать
— Поднимаем кластер PostgreSQL в Docker и Testcontainers
— Meeting & Mastering Java
— Navigating Code Testing Waters with Mockito: Your Testing Crew for Smooth Sailing
— I'm Learning Java s̶c̶r̶i̶p̶t̶
— Journey of completing Oracle Java Certification OCA 1Z0-808 exam
— Object Oriented Programming (OOP)
— A Deep Dive into Parking Spot LLD Design
— Difference between Interface and Abstract Class
— I’m continuing jDOSBox
— Mastering Background Processing in Android with WorkManager: A Guide to Efficient Background Processing
— [Digest] Java, Kotlin, Spring, Cloud, and More - Episode 8
Посмотреть:
🌐 Тестовое собеседование Java разработчика #28 - Леонид Земенков
Хорошего дня!
❤️ Лайк, за подборку
@javatg
Почитать:
— Как скомпилировать Spring Boot приложение в native image с помощью GraalVm и развернуть его с помощью Docker
— Объяснения по шардинга баз данных
— Синхронизация в Java, часть 1: состояния гонки, блокировки и условия
— Как задеплоить монолитный pet проект на Java с 0 и не сойти с ума… Часть 1
— Авторизация в Spring Boot приложении с Spring Security 3.1.0 и PostgreSQL
— Ракету пустил и забыл. Или как заставить DI работать
— Поднимаем кластер PostgreSQL в Docker и Testcontainers
— Meeting & Mastering Java
— Navigating Code Testing Waters with Mockito: Your Testing Crew for Smooth Sailing
— I'm Learning Java s̶c̶r̶i̶p̶t̶
— Journey of completing Oracle Java Certification OCA 1Z0-808 exam
— Object Oriented Programming (OOP)
— A Deep Dive into Parking Spot LLD Design
— Difference between Interface and Abstract Class
— I’m continuing jDOSBox
— Mastering Background Processing in Android with WorkManager: A Guide to Efficient Background Processing
— [Digest] Java, Kotlin, Spring, Cloud, and More - Episode 8
Посмотреть:
🌐 Тестовое собеседование Java разработчика #28 - Леонид Земенков
Хорошего дня!
❤️ Лайк, за подборку
@javatg
⚡Легкий способ получать свежие обновлении и следить за трендами в разработке на вашем языке. Находите свой стек и подписывайтесь:
Машинное обучение: @ai_machinelearning_big_data
Go: @Golang_google
C#: @csharp_ci
Базы данных: @sqlhub
Python: @python_job_interview
C/C++/: @cpluspluc
Data Science: @data_analysis_ml
Devops: @devOPSitsec
Rust: @rust_code
Javascript: @javascriptv
React: @react_tg
PHP: @phpshka
Docker: @docker
Android: @android_its
Мобильная разработка: @mobdevelop
Linux: linuxacademy
Big Data: www.tg-me.com/bigdatai
Хакинг: @linuxkalii
Java:@javatg
Собеседования: @machinelearning_interview
💼 Папка с вакансиями: www.tg-me.com/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: www.tg-me.com/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: www.tg-me.com/addlist/eEPya-HF6mkxMGIy
🔥ИТ-Мемы: www.tg-me.com/memes_prog
🇬🇧Английский: @english_forprogrammers
Машинное обучение: @ai_machinelearning_big_data
Go: @Golang_google
C#: @csharp_ci
Базы данных: @sqlhub
Python: @python_job_interview
C/C++/: @cpluspluc
Data Science: @data_analysis_ml
Devops: @devOPSitsec
Rust: @rust_code
Javascript: @javascriptv
React: @react_tg
PHP: @phpshka
Docker: @docker
Android: @android_its
Мобильная разработка: @mobdevelop
Linux: linuxacademy
Big Data: www.tg-me.com/bigdatai
Хакинг: @linuxkalii
Java:@javatg
Собеседования: @machinelearning_interview
💼 Папка с вакансиями: www.tg-me.com/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: www.tg-me.com/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: www.tg-me.com/addlist/eEPya-HF6mkxMGIy
🔥ИТ-Мемы: www.tg-me.com/memes_prog
🇬🇧Английский: @english_forprogrammers
1. JavaШаблоны проектирвоания
2. Cобеседования
3. Алгоритмы
4. Проекты
5. Awesome Java
6. Baeldung Tutorials
7. JHipster
8. Spring Framework
9. Spring Boot Tutorials by Java Guides
10. сracking the Coding Interview in Java
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
📖 Фундаментальное руководство по пакетам в Java
• Пакеты в Java появились с самого начала, во времена, когда язык еще назывался Oak. Их описание уже присутствует в его ранних спецификациях.
• Java-пакеты реализуют так называемое пространство имен (namespace), позволяющее использовать в проекте файлы с одинаковыми именами. Такой подход существует с давних времен во многих языках.
Также с помощью пакетов разработчики структурируют файлы удобным и понятным для себя способом, т. к. чем их больше используется в программе, тем в них сложнее становится ориентироваться. Если они будут размещаться бессистемно, то это рано или поздно приведет к полному запутыванию кодовой базы и дезориентации программистов.
И наконец, с помощью пакетов можно ограничивать доступ (из других пакетов) как целиком к классам, так и к их отдельным элементам.
Об этом и многом другом и пойдет речь в данной статье.
1. Что такое пакет
2. Примеры пакетов
3. Назначение пакетов
4. Правила создания пакетов
5. Импорт классов
6. Компиляция и запуск
7. Возможные ошибки и их решение
📌 Читать
@javatg
• Пакеты в Java появились с самого начала, во времена, когда язык еще назывался Oak. Их описание уже присутствует в его ранних спецификациях.
• Java-пакеты реализуют так называемое пространство имен (namespace), позволяющее использовать в проекте файлы с одинаковыми именами. Такой подход существует с давних времен во многих языках.
Также с помощью пакетов разработчики структурируют файлы удобным и понятным для себя способом, т. к. чем их больше используется в программе, тем в них сложнее становится ориентироваться. Если они будут размещаться бессистемно, то это рано или поздно приведет к полному запутыванию кодовой базы и дезориентации программистов.
И наконец, с помощью пакетов можно ограничивать доступ (из других пакетов) как целиком к классам, так и к их отдельным элементам.
Об этом и многом другом и пойдет речь в данной статье.
1. Что такое пакет
2. Примеры пакетов
3. Назначение пакетов
4. Правила создания пакетов
5. Импорт классов
6. Компиляция и запуск
7. Возможные ошибки и их решение
📌 Читать
@javatg
NetMock — это мощная и удобная библиотека, которая упрощает имитацию HTTP-запросов и ответов.
Улучшение стратегии тестирования HTTP-кода
• Подход предполагает изолирование HTTP-кода в отдельные компоненты, что позволяет проводить независимое тестирование остальной системы.
• Несмотря на то, что данный подход упрощает репозитории и тестовые классы, он часто пренебрегает тестированием самого HTTP-кода из-за сопутствующих сложностей.
• В результате возникает потребность проверять важнейшую логику, связанную с HTTP-запросами и парсингом JSON.
Данная проблема прослеживается в проектах, задействующих Retrofit.
Эта библиотека абстрагирует HTTP-логику посредством интерфейсов. Рассмотрим следующий фрагмент кода:
interface GitHubService {
@GET("users/{user}/repos")
suspend fun listRepos(@Path("user") user: String): List<RepoDto>
}
class GitHubRepositoryImpl(
private val githubService: GitHubService,
private val repoMapper: RepoMapper
): GitHubRepository {
override suspend fun listRepos(user: String): List<Repo> {
val repoDtos = githubService.listRepos(user)
return repoMapper.map(repoDtos)
}
}
Хотя этот подход упрощает репозитории и тестовые классы, он часто пренебрегает важными тестами для HTTP-логики. Кроме того, существует вероятность создания ненужных компонентов исключительно для упрощения модульного тестирования репозиториев.Цель модульного тестирования — предотвращать и выявлять ошибки разработчиков, тем самым гарантируя правильную работу кода. Без надлежащих тестов даже простые ошибки, такие как изменение пути с
users/{user}/repos на user/{user}/repos
или переименование поля в RepoDto, могут остаться незамеченными, что неприемлемо в профессиональном проекте. Я вовсе не критикую Retrofit. Наоборот, считаю ее отличной и удобочитаемой библиотекой.
Более того, признаю целесообразность изолирования HTTP-кода в отдельные компоненты ради улучшения структуры и удобства сопровождения.
Я просто указываю на недостатки стратегии тестирования, которую наблюдал во многих проектах. Она вынуждает больше внимания уделять комплексному тестированию HTTP-кода, вследствие чего потенциальные проблемы остаются незамеченными. Акцентируя данную проблему, призываю разработчиков с особой ответственностью подходить к тестированию HTTP-логики, тем самым обеспечивая общее качество и надежность проектов.
Имитация запросов и ответов с помощью NetMock
@Test
fun `your test`() = runTest {
val user = "some_user"
netMock.addMock(
request = {
method = Method.Get
requestUrl = "https://api.github.com/users/$user/repos"
},
response = {
code = 200
body = readFromResources("responses/repo_list.json")
}
)
val result = sut.listRepos(user)
//...
}
Для имитации запросов и ответов применяется простой API, предоставляемый NetMock.
Добавляя mock-объект в очередь ожидаемых запросов и ответов, вы можете перехватывать и контролировать поведение HTTP-взаимодействий во время тестирования.
Создание экземпляра NetMock
Читать
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉🎉🎉 Вышел Kotlin 1.9.10
Исправлено много багов, среди них, самые интересные:
В компиляторе:
KT-60659 unresolved reference: addFirst в JDK 21
KT-60986 Статические кеши в рантайме на Linux
KT-60231 NoClassDefFoundError: $$$$$NON_LOCAL_RETURN$$$$$ после обновы до 1.9.0
Gradle:
KT-61147 Компилятор 1.9.0 и Gson
KT-60543 NoClassDefFoundError для com/gradle/scan/plugin/BuildScanExtension
Native:
KT-60230 "unknown options: -ios_simulator_version_min -sdk_version" на Xcode 15 beta 3
KT-60758 'iOS-simulator' в dylib сборке для 'iOS' в Xcode 15 beta 4
https://fossies.org/linux/misc/kotlin-1.9.10.tar.gz/
@javatg
Исправлено много багов, среди них, самые интересные:
В компиляторе:
KT-60659 unresolved reference: addFirst в JDK 21
KT-60986 Статические кеши в рантайме на Linux
KT-60231 NoClassDefFoundError: $$$$$NON_LOCAL_RETURN$$$$$ после обновы до 1.9.0
Gradle:
KT-61147 Компилятор 1.9.0 и Gson
KT-60543 NoClassDefFoundError для com/gradle/scan/plugin/BuildScanExtension
Native:
KT-60230 "unknown options: -ios_simulator_version_min -sdk_version" на Xcode 15 beta 3
KT-60758 'iOS-simulator' в dylib сборке для 'iOS' в Xcode 15 beta 4
https://fossies.org/linux/misc/kotlin-1.9.10.tar.gz/
@javatg