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
Тестирование Spring компонентов
Тестирование в Spring предполагает работу как с изолированными компонентами, так и с целым приложением, используя тестовый контекст Spring. Это позволяет проверять, как классы взаимодействуют друг с другом и внешними ресурсами (например, базами данных).
Spring Test Context и аннотации для настройки тестов
1. Подготовка контекста с помощью аннотации @SpringBootTest
Аннотация @SpringBootTest используется для запуска полного контекста Spring, который включает все зарегистрированные компоненты, как если бы приложение запускалось в реальной среде.
Пример использования:
Основные возможности @SpringBootTest
Запуск полного контекста Spring.
Это включает все бины, аннотации конфигурации, и зависимости.
Подходит для интеграционных тестов или тестирования сложных взаимодействий между компонентами.
Выбор режима загрузки контекста.
@SpringBootTest позволяет управлять, как будет загружаться контекст.
Конфигурация контекста с @ContextConfiguration
Если вы хотите явно указать, какая конфигурация должна быть использована для теста, используйте @ContextConfiguration.
Пример:
2. Использование аннотаций для настройки тестов
Spring предлагает несколько аннотаций, которые помогают настроить тестовый контекст.
1. @MockBean (заменена на @MockitoBean) и @SpyBean
@MockitoBean: Создаёт mock-объекты для использования в контексте Spring.
@SpyBean: Позволяет частично мокировать реальные компоненты.
Пример:
2. @TestPropertySource
Эта аннотация позволяет переопределить свойства конфигурации приложения для тестов.
Пример:
3. Дополнительные аннотации
@DirtiesContext: Перезагружает контекст после выполнения теста. Используется, если тест изменяет состояние контекста.
@Transactional: Автоматически откатывает изменения, сделанные в рамках теста, в базу данных.
@Sql и @SqlGroup: Выполняет SQL-скрипты до или после тестов.
#Java #Training #Spring #Testing #Mockito #SpringBootTest #MockBean #ContextConfiguration
Тестирование в Spring предполагает работу как с изолированными компонентами, так и с целым приложением, используя тестовый контекст Spring. Это позволяет проверять, как классы взаимодействуют друг с другом и внешними ресурсами (например, базами данных).
Spring Test Context и аннотации для настройки тестов
1. Подготовка контекста с помощью аннотации @SpringBootTest
Аннотация @SpringBootTest используется для запуска полного контекста Spring, который включает все зарегистрированные компоненты, как если бы приложение запускалось в реальной среде.
Пример использования:
@SpringBootTest
public class ApplicationTests {
@Autowired
private MyService myService;
@Test
public void contextLoads() {
Assertions.assertNotNull(myService);
}
}
Основные возможности @SpringBootTest
Запуск полного контекста Spring.
Это включает все бины, аннотации конфигурации, и зависимости.
Подходит для интеграционных тестов или тестирования сложных взаимодействий между компонентами.
Выбор режима загрузки контекста.
@SpringBootTest позволяет управлять, как будет загружаться контекст.
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) // Загружается mock-среда
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) // Используется реальный сервер с портом
Конфигурация контекста с @ContextConfiguration
Если вы хотите явно указать, какая конфигурация должна быть использована для теста, используйте @ContextConfiguration.
Пример:
@ContextConfiguration(classes = MyConfig.class) // Задаём конкретный класс конфигурации
@SpringBootTest
public class ConfiguredTest {
@Autowired
private MyService myService;
@Test
public void testWithCustomConfig() {
Assertions.assertNotNull(myService);
}
}
2. Использование аннотаций для настройки тестов
Spring предлагает несколько аннотаций, которые помогают настроить тестовый контекст.
1. @MockBean (заменена на @MockitoBean) и @SpyBean
@MockitoBean: Создаёт mock-объекты для использования в контексте Spring.
@SpyBean: Позволяет частично мокировать реальные компоненты.
Пример:
@SpringBootTest
public class ServiceTest {
@MockitoBean
private MyRepository myRepository;
@SpyBean
private MyService myService;
@Test
public void testWithMockBean() {
Mockito.when(myRepository.findById(1L)).thenReturn(Optional.of(new MyEntity(1L, "Test")));
String result = myService.processEntity(1L);
Assertions.assertEquals("Processed: Test", result);
}
}
2. @TestPropertySource
Эта аннотация позволяет переопределить свойства конфигурации приложения для тестов.
Пример:
@TestPropertySource(properties = "spring.datasource.url=jdbc:h2:mem:testdb")
@SpringBootTest
public class PropertySourceTest {
@Autowired
private DataSource dataSource;
@Test
public void testProperties() throws SQLException {
Assertions.assertTrue(dataSource.getConnection().getMetaData().getURL().contains("testdb"));
}
}
3. Дополнительные аннотации
@DirtiesContext: Перезагружает контекст после выполнения теста. Используется, если тест изменяет состояние контекста.
@Transactional: Автоматически откатывает изменения, сделанные в рамках теста, в базу данных.
@Sql и @SqlGroup: Выполняет SQL-скрипты до или после тестов.
#Java #Training #Spring #Testing #Mockito #SpringBootTest #MockBean #ContextConfiguration
Что выведет код?
#Tasks
public class Task060125_1 {
public static void main(String[] args) {
int a = 10;
double b = 3.0;
double c = a / b;
System.out.println(c);
}
}
#Tasks
Вопросы с собеседования 👩💻
Вопрос: Что такое JVM?
Вопрос: Что такое JVM?
Anonymous Quiz
9%
Это инструмент для компиляции Java-кода.
89%
Это виртуальная машина, которая выполняет байт-код Java.
2%
Это библиотека для работы с сетью в Java.
0%
Это среда разработки для Java.
Please open Telegram to view this post
VIEW IN TELEGRAM