Olga Lugacheva
Posted on November 16, 2024
Привет, уважаемый Java-воин! 🤓 Если ты здесь, значит, пришла пора встать на тропу тестирования и доказать, что твой код работает лучше, чем обещания маркетологов. Сегодня мы поговорим о тестировании логики в Spring на базе базы данных H2. Погнали! 🚀
Зачем нам H2?
Представь: ты пишешь крутейший сервис, но боишься, что твоя бизнес-логика живёт в мире иллюзий. Ты не хочешь, чтобы тесты гоняли реальную базу, потому что:
- Это медленно.
- Это рисковано (удалить что-то случайно? Мы не такие!).
- Это слишком реалистично, а H2 — это наша матрица, где всё под контролем. H2 — это твой код-друг:
- Лёгкая.
- Встраиваемая.
- Идеальная для тестов.
Настройка application.properties: пусть H2 работает за тебя
Прежде чем мы начнём, подготовим наш уютный тестовый мирок. Для этого пропишем нужные настройки в src/test/resources/application.properties. Вуаля:
# Подключаем H2
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
# Убедимся, что Hibernate всё за нас делает
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
Что это всё значит?
spring.datasource.url: указывает, что мы хотим использовать базу "в памяти" (mem:testdb), которая исчезнет, как только мы выключим тесты.
DB_CLOSE_DELAY=-1: база будет жить до конца JVM (да здравствует стабильность!).
spring.jpa.hibernate.ddl-auto=create-drop: создаём базу при запуске тестов, удаляем после. Чистота — залог успеха.
Добавляем зависимости
Для Maven
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
Для Gradle
implementation 'com.h2database:h2'
Настраиваем тесты
Теперь напишем наши тесты. Включаем Spring, магию аннотаций и немного любви к коду.
Пример: Добавление пользователя
Допустим, у нас есть сущность User:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getters и setters
}
Тестируем добавление пользователя
@ExtendWith(SpringExtension.class)
@SpringBootTest
class UserServiceTest {
@Autowired
private UserRepository userRepository;
@Test
void testAddUser() {
// Создаём пользователя
User user = new User();
user.setName("Иван");
user.setEmail("ivan@example.com");
// Сохраняем в базу
userRepository.save(user);
// Проверяем, что пользователь добавился
List<User> users = userRepository.findAll();
assertEquals(1, users.size());
assertEquals("Иван", users.get(0).getName());
}
}
Что здесь происходит?
@SpringBootTest
: Поднимаем контекст Spring (всё как на проде, но безопасно).
@Autowired
: Впрыскиваем зависимости, потому что мы заслужили.
UserRepository: твой репозиторий работает, как в бою.
Итоги
Теперь ты знаешь, как устроить дружбу между Spring, H2 и тестами. Эти примеры — твой ключ к миру, где багов нет, а тесты работают с первого раза. Не забывай: тесты не делают код лучше, но зато помогают спать спокойно. Удачи! 😊
Posted on November 16, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.