This media is not supported in your browser
VIEW IN TELEGRAM
HTML язык программирования? Жестко 🤪😂
С Новым Годом!🎄 🎁
С Новым Годом!
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Дебаггер дихлофос😂🤪
С Новым Годом!🎄 🎁
С Новым Годом!
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Ой...😱🤪😂
С Новым Годом!🎄 🎁
С Новым Годом!
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Кто себя узнал?🤪😂
С Новым Годом!🎄 🎁
С Новым Годом!
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
А платить будут как обычному разрабу😡🧐😂
С Новым Годом!🎄 🎁
С Новым Годом!
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Тестеры, мы Вас уважаем и ценим😂😂😂
С Новым Годом!🎄 🎁
С Новым Годом!
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Ой, как же так?! 😎🤪😂
С Новым Годом!🎄 🎁
С Новым Годом!
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Это мы? 🧐😱🤪😂
С Новым Годом!🎄 🎁
С Новым Годом!
Please open Telegram to view this post
VIEW IN TELEGRAM
Ну что ребят, отдохнули? 😈
Сегодня продолжаем изучение тем по Java! А в воскресение вновь встречаемся)
Пишите в комментариях, если после праздников темы пойдут туго!😏
Сегодня продолжаем изучение тем по Java! А в воскресение вновь встречаемся)
Пишите в комментариях, если после праздников темы пойдут туго!
Please open Telegram to view this post
VIEW IN TELEGRAM
Аргумент-матчеры и частичное мокирование
Mockito не ограничивается базовыми функциями вроде создания моков или проверки вызовов. Продвинутые возможности библиотеки позволяют обрабатывать сложные сценарии, такие как использование аргумент-матчеров, частичное мокирование и контроль порядка вызовов.
1. Аргумент-матчеры
Аргумент-матчеры позволяют проверять вызовы методов, не завися от конкретных значений параметров. Это полезно, если параметры варьируются или неизвестны заранее.
Использование стандартных матчеров:
any – принимает любое значение:
eq – проверяет точное соответствие:
argThat – настраиваемые условия:
2. Частичное мокирование с помощью spy
Иногда требуется протестировать объект, сохранив его реальные методы, но с возможностью переопределения некоторых из них. Для этого используется spy.
Пример использования spy:
Важные моменты:
Используйте spy для реальных объектов, если нужна их логика.
Не смешивайте when и doReturn для одного и того же метода у spy (о doReturn поговорим в следующем посте).
Когда использовать эти подходы?
Аргумент-матчеры полезны для методов с динамическими параметрами.
spy – когда объект имеет сложную логику, которую нельзя полностью заменить mock.
Тест с аргумент-матчерами и spy
Допустим, у нас есть сервис:
Тест с spy:
#Java #Training #Spring #Testing #Mockito #Spy
Mockito не ограничивается базовыми функциями вроде создания моков или проверки вызовов. Продвинутые возможности библиотеки позволяют обрабатывать сложные сценарии, такие как использование аргумент-матчеров, частичное мокирование и контроль порядка вызовов.
1. Аргумент-матчеры
Аргумент-матчеры позволяют проверять вызовы методов, не завися от конкретных значений параметров. Это полезно, если параметры варьируются или неизвестны заранее.
Использование стандартных матчеров:
any – принимает любое значение:
Mockito.when(mockList.get(anyInt())).thenReturn("Default");
System.out.println(mockList.get(0)); // Выведет: Default
System.out.println(mockList.get(999)); // Выведет: Default
eq – проверяет точное соответствие:
Mockito.when(mockList.get(eq(1))).thenReturn("Specific");
System.out.println(mockList.get(1)); // Выведет: Specific
System.out.println(mockList.get(2)); // Выведет: null
argThat – настраиваемые условия:
Mockito.when(mockList.get(argThat(i -> i % 2 == 0))).thenReturn("Even");
System.out.println(mockList.get(2)); // Выведет: Even
System.out.println(mockList.get(3)); // Выведет: null
2. Частичное мокирование с помощью spy
Иногда требуется протестировать объект, сохранив его реальные методы, но с возможностью переопределения некоторых из них. Для этого используется spy.
Пример использования spy:
List<String> realList = new ArrayList<>();
List<String> spyList = Mockito.spy(realList);
// Переопределяем метод
Mockito.when(spyList.size()).thenReturn(100);
// Реальные методы продолжают работать
spyList.add("Item");
System.out.println(spyList.get(0)); // Выведет: Item
System.out.println(spyList.size()); // Выведет: 100
Важные моменты:
Используйте spy для реальных объектов, если нужна их логика.
Не смешивайте when и doReturn для одного и того же метода у spy (о doReturn поговорим в следующем посте).
Когда использовать эти подходы?
Аргумент-матчеры полезны для методов с динамическими параметрами.
spy – когда объект имеет сложную логику, которую нельзя полностью заменить mock.
Тест с аргумент-матчерами и spy
Допустим, у нас есть сервис:
@Service
public class CalculatorService {
public int add(int a, int b) {
return a + b;
}
public int multiply(int a, int b) {
return a * b;
}
}
Тест с spy:
@ExtendWith(MockitoExtension.class)
public class CalculatorServiceTest {
@Spy
private CalculatorService calculatorService;
@Test
void testPartialMocking() {
// Частично переопределяем метод
Mockito.when(calculatorService.add(anyInt(), eq(0))).thenReturn(0);
// Проверка
Assertions.assertEquals(0, calculatorService.add(10, 0)); // Переопределено
Assertions.assertEquals(30, calculatorService.add(10, 20)); // Реальная логика
// Проверяем другой метод
Assertions.assertEquals(200, calculatorService.multiply(10, 20));
}
}
#Java #Training #Spring #Testing #Mockito #Spy
https://t.me/Java_for_beginner_dev/1287
Тем кому интересно - я нашел решения проблем. Во всем виноват Gradle🤪😂😂
Тем кому интересно - я нашел решения проблем. Во всем виноват Gradle🤪😂😂
Telegram
Java for Beginner
Пишем тестовое задание от реального работодателя. Заключительная часть. Встреча от 29.12.2024
Запись нашей встречи -
YOUTUBE
RUTUBE
На сегодняшней встрече мы закончили писать тестовый сервис по документации реального работодателя с hh.ru:
— Исправление…
Запись нашей встречи -
YOUTUBE
RUTUBE
На сегодняшней встрече мы закончили писать тестовый сервис по документации реального работодателя с hh.ru:
— Исправление…
Что выведет код?
#Tasks
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class Task030125_1 {
static class Person {
String name;
Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
public static void main(String[] args) {
Set<Person> set = new HashSet<>();
set.add(new Person("Alice"));
set.add(new Person("Bob"));
set.add(new Person("Alice"));
System.out.println(set.size());
}
}
#Tasks
Всё о thenReturn, thenThrow и thenAnswer в Mockito
Когда создаются моки с помощью Mockito, вы можете настроить их поведение через методы when и then.... Эти методы позволяют указать, что должен вернуть мок-объект или как он должен себя вести при вызове его методов.
1. thenReturn
thenReturn задаёт значение, которое метод мока должен возвращать при вызове. Это самый простой способ настройки поведения.
Пример:
Особенности:
Может возвращать один и тот же результат для любого вызова.
Если метод вызывается с аргументом, для которого не задано поведение, возвращается значение по умолчанию (например, null для объектов, 0 для чисел).
Множественные возвраты:
Вы можете задать несколько возвратов, которые будут использоваться последовательно:
Когда использовать?
Если поведение метода не меняется в зависимости от параметров.
Для упрощения мокирования статичных данных.
2. thenThrow
thenThrow позволяет настроить метод на выброс исключения при его вызове.
Множественные исключения:
Как и в случае с thenReturn, вы можете задать несколько последовательных исключений:
Когда использовать?
Для тестирования обработки исключений.
Для проверки, как система справляется с ошибками (например, сбои базы данных, ошибки сети).
3. thenAnswer
thenAnswer даёт полный контроль над тем, как метод мока реагирует на вызовы. Вы можете задать сложную логику, которая учитывает переданные параметры или состояние теста.
Пример:
Особенности:
Полезен для создания динамического поведения.
Работает через интерфейс Answer, который предоставляет доступ к объекту вызова (InvocationOnMock).
Может быть использован для логирования или трассировки вызовов.
Реализация сложной логики
Допустим, вы хотите, чтобы метод мока возвращал разные значения в зависимости от индекса:
#Java #Training #Spring #Testing #Mockito #thenReturn #thenThrow #thenAnswer
Когда создаются моки с помощью Mockito, вы можете настроить их поведение через методы when и then.... Эти методы позволяют указать, что должен вернуть мок-объект или как он должен себя вести при вызове его методов.
1. thenReturn
thenReturn задаёт значение, которое метод мока должен возвращать при вызове. Это самый простой способ настройки поведения.
Пример:
List<String> mockList = Mockito.mock(List.class);
// Настраиваем поведение метода
Mockito.when(mockList.get(0)).thenReturn("MockedValue");
// Проверяем
System.out.println(mockList.get(0)); // Выведет: MockedValue
System.out.println(mockList.get(1)); // Выведет: null (по умолчанию)
Особенности:
Может возвращать один и тот же результат для любого вызова.
Если метод вызывается с аргументом, для которого не задано поведение, возвращается значение по умолчанию (например, null для объектов, 0 для чисел).
Множественные возвраты:
Вы можете задать несколько возвратов, которые будут использоваться последовательно:
Mockito.when(mockList.get(0))
.thenReturn("FirstCall")
.thenReturn("SecondCall");
System.out.println(mockList.get(0)); // Выведет: FirstCall
System.out.println(mockList.get(0)); // Выведет: SecondCall
System.out.println(mockList.get(0)); // Выведет: SecondCall (последний возврат повторяется)
Когда использовать?
Если поведение метода не меняется в зависимости от параметров.
Для упрощения мокирования статичных данных.
2. thenThrow
thenThrow позволяет настроить метод на выброс исключения при его вызове.
Копировать код
List<String> mockList = Mockito.mock(List.class);
// Настраиваем метод
Mockito.when(mockList.get(1)).thenThrow(new RuntimeException("Error occurred"));
// Попробуем вызвать
try {
mockList.get(1); // Бросит исключение
} catch (RuntimeException e) {
System.out.println(e.getMessage()); // Выведет: Error occurred
}
Множественные исключения:
Как и в случае с thenReturn, вы можете задать несколько последовательных исключений:
Mockito.when(mockList.get(0))
.thenThrow(new IllegalArgumentException("First error"))
.thenThrow(new RuntimeException("Second error"));
try {
mockList.get(0); // Бросит IllegalArgumentException
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage()); // Выведет: First error
}
try {
mockList.get(0); // Бросит RuntimeException
} catch (RuntimeException e) {
System.out.println(e.getMessage()); // Выведет: Second error
}
Когда использовать?
Для тестирования обработки исключений.
Для проверки, как система справляется с ошибками (например, сбои базы данных, ошибки сети).
3. thenAnswer
thenAnswer даёт полный контроль над тем, как метод мока реагирует на вызовы. Вы можете задать сложную логику, которая учитывает переданные параметры или состояние теста.
Пример:
List<String> mockList = Mockito.mock(List.class);
// Настраиваем кастомное поведение
Mockito.when(mockList.get(anyInt())).thenAnswer(invocation -> {
int index = invocation.getArgument(0);
return "Value at index " + index;
});
// Проверяем
System.out.println(mockList.get(0)); // Выведет: Value at index 0
System.out.println(mockList.get(5)); // Выведет: Value at index 5
Особенности:
Полезен для создания динамического поведения.
Работает через интерфейс Answer, который предоставляет доступ к объекту вызова (InvocationOnMock).
Может быть использован для логирования или трассировки вызовов.
Реализация сложной логики
Допустим, вы хотите, чтобы метод мока возвращал разные значения в зависимости от индекса:
Mockito.when(mockList.get(anyInt())).thenAnswer(invocation -> {
int index = invocation.getArgument(0);
if (index % 2 == 0) {
return "Even Index";
} else {
return "Odd Index";
}
});
System.out.println(mockList.get(2)); // Выведет: Even Index
System.out.println(mockList.get(3)); // Выведет: Odd Index
#Java #Training #Spring #Testing #Mockito #thenReturn #thenThrow #thenAnswer
Логирование вызовов:
Полный пример с использованием всех трёх методов
Представим сервис для обработки заказов:
Тест:
#Java #Training #Spring #Testing #Mockito #thenReturn #thenThrow #thenAnswer
Mockito.when(mockList.get(anyInt())).thenAnswer(invocation -> {
int index = invocation.getArgument(0);
System.out.println("Method called with index: " + index);
return "Logged Value";
});
System.out.println(mockList.get(10)); // Лог: Method called with index: 10
// Вывод: Logged Value
Полный пример с использованием всех трёх методов
Представим сервис для обработки заказов:
@Service
public class OrderService {
public String createOrder(String productId) {
return "Order created for product: " + productId;
}
public void cancelOrder(String orderId) {
throw new UnsupportedOperationException("Cancel not supported");
}
public String getOrderStatus(String orderId) {
return "Status for order " + orderId;
}
}
Тест:
@ExtendWith(MockitoExtension.class)
public class OrderServiceTest {
@Mock
private OrderService orderService;
@Test
void testThenReturn() {
// Настраиваем thenReturn
Mockito.when(orderService.createOrder("123")).thenReturn("Mocked Order Created");
String result = orderService.createOrder("123");
Assertions.assertEquals("Mocked Order Created", result);
}
@Test
void testThenThrow() {
// Настраиваем thenThrow
Mockito.when(orderService.cancelOrder("invalid")).thenThrow(new IllegalArgumentException("Invalid Order"));
Assertions.assertThrows(IllegalArgumentException.class, () -> {
orderService.cancelOrder("invalid");
});
}
@Test
void testThenAnswer() {
// Настраиваем thenAnswer
Mockito.when(orderService.getOrderStatus(anyString())).thenAnswer(invocation -> {
String orderId = invocation.getArgument(0);
return "Dynamic status for " + orderId;
});
String status = orderService.getOrderStatus("456");
Assertions.assertEquals("Dynamic status for 456", status);
}
}
#Java #Training #Spring #Testing #Mockito #thenReturn #thenThrow #thenAnswer
Всем привет!🖐
Увлекся и забыл написать, что завтра как обычно мы встречаемся в 16:00 по МСК и будем повторять Spring AOP💪
Если сам вспомню 😛
Жду всех как всегда!🍸
Увлекся и забыл написать, что завтра как обычно мы встречаемся в 16:00 по МСК и будем повторять Spring AOP💪
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет! 💪
С самого утра готовлю для Вас всю возможную информацию по Spring AOP, есть что рассказать😎
К сожалению Security оказался не простым для подготовки с наскока😐 , поэтому его я перенесу на следующие встречи 😐
В 16:00 всех жду на встречу!👀
С самого утра готовлю для Вас всю возможную информацию по Spring AOP, есть что рассказать
К сожалению Security оказался не простым для подготовки с наскока
В 16:00 всех жду на встречу!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Наглядно разбираем Spring AOP, пишем свою аннотацию. Встреча от 05.01.2025
Запись нашей встречи -
YOUTUBE
RUTUBE
На сегодняшней встрече в прикладном ключе мы разобрали:
— Что такое Spring AOP и для чего он нужен.
— Что такое Advice и Poincut
— Как написать логирование без внесения изменений в отслеживаемый код
— Написание аннотации и запуск логики для аннотируемого ею метода
Код на GitHub - https://github.com/Oleborn/WebTasksManager.git
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Всем хорошего настроения!🤘 🔫
Запись нашей встречи -
YOUTUBE
RUTUBE
На сегодняшней встрече в прикладном ключе мы разобрали:
— Что такое Spring AOP и для чего он нужен.
— Что такое Advice и Poincut
— Как написать логирование без внесения изменений в отслеживаемый код
— Написание аннотации и запуск логики для аннотируемого ею метода
Код на GitHub - https://github.com/Oleborn/WebTasksManager.git
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Всем хорошего настроения!
Please open Telegram to view this post
VIEW IN TELEGRAM