Java for Beginner
672 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
Всем привет!🖐

Увлекся и забыл написать, что завтра как обычно мы встречаемся в 16:00 по МСК и будем повторять Spring AOP💪

Если сам вспомню 😛

Жду всех как всегда!
🍸
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет! 💪

С самого утра готовлю для Вас всю возможную информацию по 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

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

Всем хорошего настроения! 🤘🔫
Please open Telegram to view this post
VIEW IN TELEGRAM
Тестирование Spring компонентов

Тестирование в 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
Что выведет код?

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
Работа к которой мы все не стремимся 😂 👏

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Интеграционные тесты с использованием базы данных

1. Что такое интеграционные тесты?

Интеграционные тесты проверяют работу нескольких компонентов вместе, включая взаимодействие с внешними системами, такими как базы данных, REST API и т. д. Spring предлагает инструменты для упрощения тестирования с использованием реальной базы данных.

2. Интеграционные тесты с PostgreSQL


Чтобы протестировать взаимодействие с базой данных, можно использовать тестовую базу данных (например, H2) или реальную базу данных, такую как PostgreSQL.

Добавьте зависимости: В pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>test</scope>
</dependency>


Настройте application-test.properties:
spring.datasource.url=jdbc:postgresql://localhost:5432/testdb
spring.datasource.username=test
spring.datasource.password=test
spring.jpa.hibernate.ddl-auto=update


Пример теста:
@SpringBootTest
@TestPropertySource(locations = "classpath:application-test.properties")
@Transactional
public class UserRepositoryTest {

@Autowired
private UserRepository userRepository;

@Test
public void testSaveAndFindUser() {
// Создаём пользователя
User user = new User();
user.setName("John");
user.setEmail("john@example.com");

// Сохраняем пользователя
userRepository.save(user);

// Проверяем, что он сохраняется и извлекается
Optional<User> foundUser = userRepository.findById(user.getId());
Assertions.assertTrue(foundUser.isPresent());
Assertions.assertEquals("John", foundUser.get().getName());
}
}


3. Использование @Sql для предустановки данных

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

@Sql(scripts = "/test-data.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD)
@SpringBootTest
public class SqlTest {

@Autowired
private UserRepository userRepository;

@Test
public void testWithSqlData() {
Optional<User> user = userRepository.findByName("PreloadedUser");
Assertions.assertTrue(user.isPresent());
}
}


Пример test-data.sql:
INSERT INTO users (id, name, email) VALUES (1, 'PreloadedUser', 'user@example.com');


#Java #Training #Spring #Testing #Mockito #IntegrationTests
Тестирование веб-приложений в Spring

Веб-приложения являются центральным элементом многих проектов, а тестирование REST-контроллеров помогает убедиться, что API работает корректно. Для этих целей Spring предлагает инструменты, такие как MockMvc и аннотация @WebMvcTest.

Основы тестирования контроллеров с MockMvc и @WebMvcTest

1. Использование MockMvc

MockMvc — это инструмент для тестирования REST-контроллеров без необходимости запуска всего приложения.

Он позволяет:
Отправлять HTTP-запросы к контроллерам.
Проверять их ответы (статус, заголовки, тело и т. д.).
Работать с сериализацией/десериализацией JSON.



Создайте тестовый класс с аннотацией @WebMvcTest:
@WebMvcTest(controllers = MyController.class)
public class MyControllerTest {

@Autowired
private MockMvc mockMvc;

@MockBean
private MyService myService;

// Тесты будут здесь
}


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

Аннотация
@WebMvcTest конфигурирует Spring так, чтобы загружались только веб-компоненты, связанные с тестируемыми контроллерами. Это делает тесты быстрыми и изолированными.

Особенности:
Загружает только контекст веб-слоя:
Регистрируются только контроллеры, обработчики ошибок и связанные с ними компоненты.
Другие части приложения, такие как сервисы или репозитории, не загружаются.


Использование @MockitoBean:
Для замены зависимостей контроллеров мок-объектами.
Импорт дополнительных компонентов: Если нужно задействовать специфическую конфигурацию, можно использовать @Import.

Пример:
@WebMvcTest(controllers = MyController.class)
@Import(MyCustomConfig.class)
public class MyControllerTest {
// Тесты
}


3. Методы MockMvc: perform, andExpect, andReturn


Метод perform

Отправляет HTTP-запрос к указанному маршруту контроллера. Он принимает объект MockHttpServletRequestBuilder, который позволяет настроить запрос.

Пример GET-запроса:
mockMvc.perform(get("/api/items"))
.andExpect(status().isOk());


Пример POST-запроса:
mockMvc.perform(post("/api/items")
.content("{\"name\":\"Test Item\"}")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isCreated());


Метод andExpect

Проверяет различные аспекты ответа:
HTTP-статус.
Заголовки.
Тело ответа.


Пример:
mockMvc.perform(get("/api/items"))
.andExpect(status().isOk()) // Проверка HTTP-статуса
.andExpect(content().contentType(MediaType.APPLICATION_JSON)) // Проверка заголовка Content-Type
.andExpect(jsonPath("$.size()").value(3)); // Проверка JSON-данных


Метод andReturn

Возвращает полный объект ответа, который можно анализировать для более сложных проверок.

Пример:
MvcResult result = mockMvc.perform(get("/api/items"))
.andExpect(status().isOk())
.andReturn();

String responseBody = result.getResponse().getContentAsString();
Assertions.assertTrue(responseBody.contains("ItemName"));


4. Работа с сериализацией и тестирование JSON-данных

Для тестирования контроллеров, возвращающих JSON, полезно использовать библиотеку Jackson (по умолчанию в Spring Boot).

Пример сериализации объекта в JSON:
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(new Item(1L, "Test Item"));


Пример десериализации JSON в объект:
String jsonResponse = "{\"id\":1,\"name\":\"Test Item\"}";
Item item = objectMapper.readValue(jsonResponse, Item.class);
Assertions.assertEquals("Test Item", item.getName());


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

public class Task070125_1 {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "world";
String result = str1.concat(" ").concat(str2).toUpperCase();
System.out.println(result);
}
}


#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM
Написание тестов для CRUD REST API

Пример контроллера
@RestController
@RequestMapping("/api/items")
public class ItemController {

private final ItemService itemService;

@Autowired
public ItemController(ItemService itemService) {
this.itemService = itemService;
}

@GetMapping
public List<Item> getAllItems() {
return itemService.getAllItems();
}

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public Item createItem(@RequestBody Item item) {
return itemService.saveItem(item);
}

@DeleteMapping("/{id}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteItem(@PathVariable Long id) {
itemService.deleteItem(id);
}
}


Тестирование CRUD операций
@WebMvcTest(controllers = ItemController.class)
public class ItemControllerTest {

@Autowired
private MockMvc mockMvc;

@MockitoBean
private ItemService itemService;

@Test
public void testGetAllItems() throws Exception {
List<Item> items = Arrays.asList(new Item(1L, "Item1"), new Item(2L, "Item2"));
Mockito.when(itemService.getAllItems()).thenReturn(items);

mockMvc.perform(get("/api/items"))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("$.size()").value(2))
.andExpect(jsonPath("$[0].name").value("Item1"));
}

@Test
public void testCreateItem() throws Exception {
Item item = new Item(1L, "NewItem");
Mockito.when(itemService.saveItem(Mockito.any(Item.class))).thenReturn(item);

mockMvc.perform(post("/api/items")
.content("{\"name\":\"NewItem\"}")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isCreated())
.andExpect(jsonPath("$.name").value("NewItem"));
}

@Test
public void testDeleteItem() throws Exception {
mockMvc.perform(delete("/api/items/1"))
.andExpect(status().isNoContent());
}
}


Особенности

@MockitoBean для сервиса:
Изолирует тест от реального сервиса.
Позволяет задавать поведение с помощью Mockito.


Тестирование сериализации/десериализации:
Используйте ObjectMapper для работы с JSON.

Работа с jsonPath:
Удобный способ проверки JSON-структур.

#Java #Training #Spring #Testing #Mockito #TestingWeb
Основы тестирования взаимодействия с базами данных в Spring

Тестирование взаимодействия с базами данных — важная часть разработки приложений на Spring.

Основные аннотации


@DataJpaTest:
Эта аннотация используется для тестирования JPA-репозиториев. Она настраивает in-memory базу данных (например, H2) по умолчанию, но можно настроить и для работы с PostgreSQL.
Автоматически настраивает EntityManager, DataSource и другие компоненты, необходимые для работы с JPA.

@SpringBootTest:
Используется для интеграционного тестирования, когда нужно поднять весь контекст Spring. Подходит для тестирования взаимодействия с реальной базой данных.
Можно указать webEnvironment = SpringBootTest.WebEnvironment.NONE, чтобы не поднимать веб-сервер.


@TestConfiguration:
Позволяет определить дополнительные бины или конфигурации, которые будут использоваться только в тестах.

@Sql:
Позволяет выполнять SQL-скрипты перед или после тестов. Например, для заполнения базы данных тестовыми данными.

@Transactional:
Указывает, что тест должен выполняться в транзакции, которая будет откачена после завершения теста. Это помогает избежать изменений в базе данных между тестами.

@AutoConfigureTestDatabase:
Позволяет заменить in-memory базу данных на реальную (например, PostgreSQL) для тестирования.

Настройка тестовой базы данных

Для тестирования с PostgreSQL нужно:
Добавить зависимость на PostgreSQL в pom.xml или build.gradle:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>


Настроить application-test.properties или application-test.yml для подключения к PostgreSQL:
spring.datasource.url=jdbc:postgresql://localhost:5432/testdb
spring.datasource.username=user
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=create-drop


Пример теста
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Sql(scripts = "/init-test-data.sql")
public class UserRepositoryTest {

@Autowired
private UserRepository userRepository;

@Test
public void testFindByUsername() {
User user = userRepository.findByUsername("testuser");
assertNotNull(user);
assertEquals("testuser", user.getUsername());
}
}


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

public class Task080125_1 {
private static int x = 5;

static {
x = 10;
}

{
x = 15;
}

public Task080125_1() {
System.out.println(x);
}

public static void main(String[] args) {
new Task080125_1();
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
26%
5
19%
10
22%
15
26%
Ошибка компиляции
7%
🫵
Как знакомо... 😠🤣

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM