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

easycat

Olga Lugacheva

Posted on November 16, 2024

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 и тестами. Эти примеры — твой ключ к миру, где багов нет, а тесты работают с первого раза. Не забывай: тесты не делают код лучше, но зато помогают спать спокойно. Удачи! 😊

💖 💪 🙅 🚩
easycat
Olga Lugacheva

Posted on November 16, 2024

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related