Введение в Mockito
Mockito – это популярная библиотека для создания mock-объектов в тестировании. Она позволяет симулировать поведение объектов, чтобы изолировать тестируемую часть кода. Важное преимущество Mockito – это интеграция со Spring, благодаря которой библиотека легко используется в проектах без дополнительной настройки. Достаточно подключить зависимость в проекте.
Основные концепции Mockito
1. Создание моков
Чтобы создать mock-объект, используется метод Mockito.mock(Class). Этот объект ведёт себя как заглушка: он не выполняет реальной логики, но может возвращать заданные вами значения.
Пример:
2. Аннотация @Mock
Аннотация @Mock упрощает создание mock-объектов. Вместо ручного вызова Mockito.mock(), вы просто добавляете эту аннотацию над полем.
Пример:
⚠️ Чтобы аннотация заработала, используйте @ExtendWith(MockitoExtension.class) (в JUnit 5) или вызовите MockitoAnnotations.openMocks(this) в JUnit 4.
Stub и возвращение значений
Stub – это настройка поведения mock-объекта. Вы указываете, какое значение должен возвращать mock при вызове его методов. В Mockito для этого используются методы when и thenReturn или thenThrow.
Пример:
Преимущества использования Mockito в Spring
Mockito прекрасно сочетается со Spring. Например:
Нет необходимости в явной настройке.
Использование моков через аннотации (@Mock, @InjectMocks) позволяет минимизировать код.
Легкая интеграция с контекстом Spring для тестирования бинов.
#Java #Training #Spring #Testing #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
Что выведет код?
#Tasks
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
Проверка вызовов методов с помощью verify в Mockito
Mockito позволяет убедиться, что методы ваших mock-объектов вызывались определённое количество раз, в правильной последовательности или с определёнными параметрами. Это называется проверка взаимодействий.
Как работает verify?
Если метод не был вызван, тест упадёт с ошибкой.
Расширенные проверки
Количество вызовов:
Последовательность вызовов:
Проверка отсутствия взаимодействий:
Пример: Тестирование сервиса с использованием Mockito
Рассмотрим сервис, который взаимодействует с репозиторием:
Тест для этого сервиса:
Что мы сделали в тесте?
Создали mock для UserRepository с помощью @Mock.
Связали mock с тестируемым сервисом через @InjectMocks.
Задали поведение mock-объекта с помощью when и проверили результат.
Убедились, что репозиторий вызван с нужными параметрами через verify.
#Java #Training #Spring #Testing #Mockito #Verify
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-го числа собраться вечерком и поздравить друг друга с наступающим Новым годом 🎄
Что скажете?
Вот и наступили последние деньки перед новым годом. Поэтому я решил не заморачивать Вас новыми постами, с ненужной в эти дни информацией, до 3-его января.
Но несмотря на это предлагаю завтра в обычное время все же закончить тестовое задание и войти в новый год со спокойной душой😂
Поэтому завтра, в обычное время, жду Вас там же где и всегда🫢🤣
Всем привет!🖐
Как и обещал, сегодня в 16:00 по МСК мы вновь встречаемся и заканчиваем тестовое задание от работодателя с HH.ru.
Что нас ждет:
— Исправление ошибок написания сервисов
— Реализация логирования
— Реализация централизованной обработки ошибок с использованием @ControllerAdvice
— Написание Swagger/OpenAPI для автоматической генерации документации
Приходите, будет интересно!💪
По всем вопросам пишите в наш чат - https://t.me/Java_Beginner_chat
Как и обещал, сегодня в 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). Стоило все это исправить как все заработало 🤷♂️.
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Всем хорошего настроения! 🫡✌️
Запись нашей встречи -
YOUTUBE
RUTUBE
На сегодняшней встрече мы закончили писать тестовый сервис по документации реального работодателя с hh.ru:
— Исправление ошибок написания сервисов.
— Реализация логирования
— Реализация централизованной обработки ошибок с использованием @ControllerAdvice и загадочная аннотация @NotNull
— Написание Swagger/OpenAPI для одного эндпоинта, который в результате не запустился😂
Решил не тратить Ваше и свое время на поиск ошибок, позже допишу тут их решение!
Решение проблем которые не смог решить в видео:
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Всем хорошего настроения! 🫡✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
Уважаемые подписчики!
С наступающим Вас Новым годом!🎄🎊
Надеюсь Вы подготовились и все хорошо!🥂🍾
Следующий обучающий пост в канале выйдет только 3 января, а чтобы Вы случайно не забыли о нем буду напоминать мемами😏🤪😂
В качестве предложения - есть возможность собраться сегодня вечерком и просто поздравить друг друга с наступающим!) Думаю в районе 18-20 часов по МСК.
Если согласны жду - 💪
С наступающим Вас Новым годом!🎄🎊
Надеюсь Вы подготовились и все хорошо!🥂🍾
Следующий обучающий пост в канале выйдет только 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
Ох не тому я учился🤪😎😂
С наступающим Новым Годом! 🎄🎊🎉
С наступающим Новым Годом! 🎄🎊🎉
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
Когда тимлид девушка😂🫡🤪
С наступающим Новым Годом! 🎄🎊🎉
С наступающим Новым Годом! 🎄🎊🎉
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
И зачем отнимать хлеб у тестировщиков?🧐🤪😂
С наступающим Новым Годом! 🎄🎊🎉
С наступающим Новым Годом! 🎄🎊🎉