Java for Beginner
673 subscribers
541 photos
155 videos
12 files
827 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Аннотации JUnit 5

Структура JUnit 5

JUnit 5 (также известный как Jupiter) предоставляет богатый набор аннотаций для управления тестами. Каждая из аннотаций служит определенной цели — от настройки окружения до группировки и выполнения тестов.

Состоит из следующих модулей:

JUnit Platform: Основная платформа для запуска тестов.
JUnit Jupiter: Новый API для написания тестов.
JUnit Vintage: Обеспечивает совместимость с JUnit 4.



Аннотации для организации тестов

@Test

Используется для обозначения метода как тестового.
Этот метод должен быть public или default.


Пример:
@Test
void testAddition() {
Assertions.assertEquals(5, 2 + 3);
}


@DisplayName

Устанавливает читаемое имя для теста, которое будет отображаться в отчетах.

Пример:
@Test
@DisplayName("Тест сложения двух чисел")
void testAddition() {
Assertions.assertEquals(5, 2 + 3);
}


@Disabled

Отключает тест, чтобы он не выполнялся.
Можно указать причину отключения.


Пример:
@Test
@Disabled("Тест временно отключен из-за изменений в логике")
void testDisabled() {
Assertions.fail("Этот тест не должен выполняться");
}


Аннотации для управления жизненным циклом тестов


@BeforeEach

Выполняется перед каждым тестом.
Используется для подготовки окружения.


Пример:
@BeforeEach
void setup() {
System.out.println("Подготовка перед тестом");
}


@AfterEach

Выполняется после каждого теста.
Используется для очистки ресурсов.


Пример:
@AfterEach
void cleanup() {
System.out.println("Очистка после теста");
}


@BeforeAll

Выполняется один раз перед всеми тестами в классе.
Метод должен быть static.


Пример:
@BeforeAll
static void globalSetup() {
System.out.println("Настройка перед всеми тестами");
}


@AfterAll

Выполняется один раз после всех тестов в классе.
Метод должен быть static.


Пример:
@AfterAll
static void globalCleanup() {
System.out.println("Очистка после всех тестов");
}


#Java #Training #Spring #Testing #JUnit_5
Что выведет код?

public class Task261224_1 {
public static void main(String[] args) {
int x = 10;
if (x > 5) {
if (x < 15) {
System.out.println("A");
} else {
System.out.println("B");
}
} else {
System.out.println("C");
}
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
48%
A
29%
B
0%
C
23%
Fuck off, mother fucker
160% пьет кофе и ищет маленькую ошибку из-за которой нихера не работает😂

https://t.me/Java_for_beginner_dev

#Mems
Продвинутые аннотации JUnit 5

Управление параметрами и контекстами

@Nested

Позволяет группировать связанные тесты в отдельные внутренние классы.

Пример:

@Nested
class MathTests {
@Test
void testAddition() {
Assertions.assertEquals(5, 2 + 3);
}

@Test
void testSubtraction() {
Assertions.assertEquals(1, 3 - 2);
}
}


@ParameterizedTest

Используется для создания параметрических тестов.
Тест выполняется несколько раз с разными значениями.


Пример:
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
void testWithParameters(int value) {
Assertions.assertTrue(value > 0);
}


@ValueSource

Определяет набор значений для параметрических тестов.

Пример:
@ParameterizedTest
@ValueSource(strings = {"Hello", "JUnit", "Test"})
void testStrings(String word) {
Assertions.assertFalse(word.isEmpty());
}


@CsvSource

Передает значения в виде CSV (Comma-Separated Values).

Пример:
@ParameterizedTest
@CsvSource({"1,2,3", "2,3,5", "3,5,8"})
void testCsvSource(int a, int b, int result) {
Assertions.assertEquals(result, a + b);
}


@EnumSource

Используется для автоматического предоставления значений из перечислений (enums) в тестовые методы.

Пример:
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

@ParameterizedTest
@EnumSource(Day.class) // Все значения перечисления Day
void testWithEnumSource(Day day) {
Assertions.assertNotNull(day, "Day should not be null");
}


@CsvFileSource

Загружает данные из CSV-файла.

Пример:
@ParameterizedTest
@CsvFileSource(resources = "/data.csv", numLinesToSkip = 1)
void testCsvFileSource(int a, int b, int result) {
Assertions.assertEquals(result, a + b);
}


Работа с условиями

@EnabledOnOs / @DisabledOnOs

Включает или отключает тест на основе операционной системы.

Пример:
@Test
@EnabledOnOs(OS.WINDOWS)
void testWindowsOnly() {
Assertions.assertTrue(System.getProperty("os.name").contains("Windows"));
}


@EnabledIf / @DisabledIf

Условное выполнение тестов.

Тестирование исключений и времени

@Timeout

Устанавливает максимальное время выполнения теста.

Пример:
@Test
@Timeout(5) // Тест завершится с ошибкой, если выполнится дольше 5 секунд
void testTimeout() {
Thread.sleep(3000);
}


@TestFactory

Используется для создания динамических тестов.

Пример:
@TestFactory
Collection<DynamicTest> dynamicTests() {
return Arrays.asList(
DynamicTest.dynamicTest("1st test", () -> Assertions.assertTrue(true)),
DynamicTest.dynamicTest("2nd test", () -> Assertions.assertEquals(4, 2 * 2))
);
}


#Java #Training #Spring #Testing #JUnit_5
Channel photo updated
Введение в Mockito

Mockito – это популярная библиотека для создания mock-объектов в тестировании. Она позволяет симулировать поведение объектов, чтобы изолировать тестируемую часть кода. Важное преимущество Mockito – это интеграция со Spring, благодаря которой библиотека легко используется в проектах без дополнительной настройки. Достаточно подключить зависимость в проекте.

Основные концепции Mockito

1. Создание моков

Чтобы создать mock-объект, используется метод Mockito.mock(Class). Этот объект ведёт себя как заглушка: он не выполняет реальной логики, но может возвращать заданные вами значения.

Пример:
List<String> mockList = Mockito.mock(List.class);
Mockito.when(mockList.size()).thenReturn(10);
System.out.println(mockList.size()); // Выведет: 10


2. Аннотация @Mock

Аннотация @Mock упрощает создание mock-объектов. Вместо ручного вызова Mockito.mock(), вы просто добавляете эту аннотацию над полем.

Пример:
@Mock
List<String> mockList;


⚠️ Чтобы аннотация заработала, используйте @ExtendWith(MockitoExtension.class) (в JUnit 5) или вызовите MockitoAnnotations.openMocks(this) в JUnit 4.

Stub и возвращение значений

Stub – это настройка поведения mock-объекта. Вы указываете, какое значение должен возвращать mock при вызове его методов. В Mockito для этого используются методы when и thenReturn или thenThrow.

Пример:
// Создание поведения для метода
Mockito.when(mockList.get(0)).thenReturn("Hello, Mockito!");
Mockito.when(mockList.get(1)).thenThrow(new RuntimeException("Ошибка"));

// Проверка
System.out.println(mockList.get(0)); // Выведет: Hello, Mockito!
System.out.println(mockList.get(1)); // Бросит исключение


Преимущества использования Mockito в Spring

Mockito прекрасно сочетается со Spring. Например:
Нет необходимости в явной настройке.
Использование моков через аннотации (@Mock, @InjectMocks) позволяет минимизировать код.
Легкая интеграция с контекстом Spring для тестирования бинов.


#Java #Training #Spring #Testing #Mockito
Что выведет код?

import java.util.stream.Stream;

public class Task271224_1 {
public static void main(String[] args) {
Stream.of(1, 2, 3, 4, 5)
.filter(n -> n % 2 == 0)
.map(n -> n * 2)
.forEach(System.out::println);
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
19%
2 4 6 8 10
4%
2 4 6
78%
4 8
0%
8 16
Повторять по мере надобности😂

https://t.me/Java_for_beginner_dev

#Mems
Проверка вызовов методов с помощью verify в Mockito

Mockito позволяет убедиться, что методы ваших mock-объектов вызывались определённое количество раз, в правильной последовательности или с определёнными параметрами. Это называется проверка взаимодействий.

Как работает verify?
List<String> mockList = Mockito.mock(List.class);

// Взаимодействие
mockList.add("Mockito");
mockList.clear();

// Проверка взаимодействий
Mockito.verify(mockList).add("Mockito"); // Проверяет вызов add с параметром "Mockito"
Mockito.verify(mockList).clear(); // Проверяет вызов clear


Если метод не был вызван, тест упадёт с ошибкой.

Расширенные проверки

Количество вызовов:
Mockito.verify(mockList, Mockito.times(1)).add("Mockito");
Mockito.verify(mockList, Mockito.never()).add("Spring");


Последовательность вызовов:
InOrder inOrder = Mockito.inOrder(mockList);
inOrder.verify(mockList).add("Mockito");
inOrder.verify(mockList).clear();


Проверка отсутствия взаимодействий:
Mockito.verifyNoInteractions(mockList);


Пример: Тестирование сервиса с использованием Mockito

Рассмотрим сервис, который взаимодействует с репозиторием:
@Service
public class UserService {
private final UserRepository userRepository;

public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}

public String getUserName(Long id) {
return userRepository.findById(id).orElse("Unknown");
}
}


Тест для этого сервиса:
@ExtendWith(MockitoExtension.class)
public class UserServiceTest {

@Mock
private UserRepository userRepository;

@InjectMocks
private UserService userService;

@Test
void getUserName_ReturnsCorrectName() {
// Stub репозитория
Mockito.when(userRepository.findById(1L)).thenReturn(Optional.of("John Doe"));

// Вызов метода
String result = userService.getUserName(1L);

// Проверки
Assertions.assertEquals("John Doe", result);
Mockito.verify(userRepository).findById(1L);
}

@Test
void getUserName_ReturnsUnknownForMissingUser() {
// Stub для случая, когда пользователь отсутствует
Mockito.when(userRepository.findById(2L)).thenReturn(Optional.empty());

// Вызов метода
String result = userService.getUserName(2L);

// Проверки
Assertions.assertEquals("Unknown", result);
Mockito.verify(userRepository).findById(2L);
}
}


Что мы сделали в тесте?


Создали mock для UserRepository с помощью @Mock.
Связали mock с тестируемым сервисом через
@InjectMocks.
Задали поведение mock-объекта с помощью when и проверили результат.
Убедились, что репозиторий вызван с нужными параметрами через verify.


#Java #Training #Spring #Testing #Mockito #Verify
Всем доброго утра!✌️

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

Но несмотря на это предлагаю завтра в обычное время все же закончить тестовое задание и войти в новый год со спокойной душой😂

Поэтому завтра, в обычное время, жду Вас там же где и всегда🫢🤣

А еще есть предложение 30-го числа собраться вечерком и поздравить друг друга с наступающим Новым годом 🎄

Что скажете?
Берег это мем до декабря. Фото подлинное🤪😂😂😂

https://t.me/Java_for_beginner_dev

#Mems
Всем привет!🖐

Как и обещал, сегодня в 16:00 по МСК мы вновь встречаемся и заканчиваем тестовое задание от работодателя с HH.ru.

Что нас ждет:
— Исправление ошибок написания сервисов
— Реализация логирования
— Реализация централизованной обработки ошибок с использованием
@ControllerAdvice
— Написание Swagger/OpenAPI для автоматической генерации документации


Приходите, будет интересно!💪

По всем вопросам пишите в наш чат - https://t.me/Java_Beginner_chat
Пишем тестовое задание от реального работодателя. Заключительная часть. Встреча от 29.12.2024

Запись нашей встречи -
YOUTUBE
RUTUBE

На сегодняшней встрече мы закончили писать тестовый сервис по документации реального работодателя с hh.ru:
— Исправление ошибок написания сервисов.
— Реализация логирования
— Реализация централизованной обработки ошибок с использованием
@ControllerAdvice и загадочная аннотация @NotNull
— Написание Swagger/OpenAPI для одного эндпоинта, который в результате не запустился😂

Решил не тратить Ваше и свое время на поиск ошибок, позже допишу тут их решение!

Решение проблем которые не смог решить в видео:
🪙В Spring Boot отсутствие значения для параметра @PathVariable (например, {id}), который помечен аннотацией @NotNull, не будет проверяться валидатором, потому что обработка @PathVariable происходит на уровне маршрутизации, а не на уровне валидации. Если маршрут не содержит обязательного параметра, такой запрос не попадет в метод контроллера и вернет ошибку 404 Not Found. Иначе, при попытке вызвать http://localhost:8080/api/socks/ без необходимого параметра {id}, просто не направляло нас на нужный эндпоинт и все 🤦‍♂️.
🪙Swagger не работал, как я и предполагал из-за неверных зависимостей. И потому, что IDEA не могла найти JDK 17 (у меня установлена только 21). Стоило все это исправить как все заработало 🤷‍♂️.

Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!

Всем хорошего настроения! 🫡✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
Channel photo updated
Уважаемые подписчики!

С наступающим Вас Новым годом!🎄🎊

Надеюсь Вы подготовились и все хорошо!🥂🍾

Следующий обучающий пост в канале выйдет только 3 января, а чтобы Вы случайно не забыли о нем буду напоминать мемами😏🤪😂

В качестве предложения - есть возможность собраться сегодня вечерком и просто поздравить друг друга с наступающим!) Думаю в районе 18-20 часов по МСК.
Если согласны жду - 💪
This media is not supported in your browser
VIEW IN TELEGRAM
HR привела нового джуна😂😂🤪

С наступающим Новым Годом! 🎄🎊🎉
This media is not supported in your browser
VIEW IN TELEGRAM
Отправь своему тимлиду 🤪😂

С наступающим Новым Годом! 🎄🎊🎉
This media is not supported in your browser
VIEW IN TELEGRAM
Все так🤪😂😂😂

С наступающим Новым Годом! 🎄🎊🎉
This media is not supported in your browser
VIEW IN TELEGRAM
Ох не тому я учился🤪😎😂

С наступающим Новым Годом! 🎄🎊🎉