DEV Community

Cover image for H2 и весёлые тесты в Spring
Olga Lugacheva
Olga Lugacheva

Posted on

H2 и весёлые тесты в Spring

Привет, уважаемый Java-воин! 🤓 Если ты здесь, значит, пришла пора встать на тропу тестирования и доказать, что твой код работает лучше, чем обещания маркетологов. Сегодня мы поговорим о тестировании логики в Spring на базе базы данных H2. Погнали! 🚀

Зачем нам H2?

Представь: ты пишешь крутейший сервис, но боишься, что твоя бизнес-логика живёт в мире иллюзий. Ты не хочешь, чтобы тесты гоняли реальную базу, потому что:

  1. Это медленно.
  2. Это рисковано (удалить что-то случайно? Мы не такие!).
  3. Это слишком реалистично, а 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

Enter fullscreen mode Exit fullscreen mode

Что это всё значит?

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>

Enter fullscreen mode Exit fullscreen mode

Для Gradle

implementation 'com.h2database:h2'
Enter fullscreen mode Exit fullscreen mode

Настраиваем тесты

Теперь напишем наши тесты. Включаем Spring, магию аннотаций и немного любви к коду.

Пример: Добавление пользователя

Допустим, у нас есть сущность User:

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    // Getters и setters
}

Enter fullscreen mode Exit fullscreen mode

Тестируем добавление пользователя

@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());
    }
}
Enter fullscreen mode Exit fullscreen mode

Что здесь происходит?

@SpringBootTest: Поднимаем контекст Spring (всё как на проде, но безопасно).
@Autowired: Впрыскиваем зависимости, потому что мы заслужили.
UserRepository: твой репозиторий работает, как в бою.

Итоги

Теперь ты знаешь, как устроить дружбу между Spring, H2 и тестами. Эти примеры — твой ключ к миру, где багов нет, а тесты работают с первого раза. Не забывай: тесты не делают код лучше, но зато помогают спать спокойно. Удачи! 😊

Billboard image

Monitoring as code

With Checkly, you can use Playwright tests and Javascript to monitor end-to-end scenarios in your NextJS, Astro, Remix, or other application.

Get started now!

Top comments (2)

Collapse
 
belousoveugene profile image
Eugene Belousov

Привет. А в pom.xml разве зависимость на h2 прописывать не надо?

Collapse
 
easycat profile image
Olga Lugacheva

Надо! Спасибо, добавили.

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Discover a treasure trove of wisdom within this insightful piece, highly respected in the nurturing DEV Community enviroment. Developers, whether novice or expert, are encouraged to participate and add to our shared knowledge basin.

A simple "thank you" can illuminate someone's day. Express your appreciation in the comments section!

On DEV, sharing ideas smoothens our journey and strengthens our community ties. Learn something useful? Offering a quick thanks to the author is deeply appreciated.

Okay