Встроенные базы данных для тестов
Настраивайте и используйте базы данных в памяти или встроенные базы данных для быстрого и изолированного интеграционного тестирования.
«Встроенные базы данных для тестов» — бесплатный урок Testing Mastery: JUnit, Mockito & Integration Tests на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Testing Mastery: JUnit, Mockito & Integration Tests, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Testing Mastery: JUnit, Mockito & Integration Tests содержит 4 уроков всего.
Части этого урока еще не переведены и отображаются на английском.
Embedded DBs for Tests
When writing integration tests for Spring Boot applications, especially those interacting with a database, you need a database instance for your tests to run against.
Embedded databases provide a lightweight, in-memory solution that's perfect for this scenario.
Why Use Embedded DBs?
Embedded databases offer several key benefits for testing:
- Isolation: Each test run gets a clean, fresh database, preventing side effects.
- Speed: Being in-memory, they are incredibly fast, reducing test execution time.
- Simplicity: No need for external database servers or complex setup.
- Repeatability: Tests are consistent because they always start with the same data state.
H2 & HSQLDB Options
Two popular choices for embedded databases in Java applications are H2 Database and HSQLDB.
- H2: A fast, open-source, JDBC-compliant in-memory database. It's widely used with Spring Boot.
- HSQLDB: Another lightweight, relational database written in Java.
We'll focus on H2 as it's a common default in Spring Boot.
Adding H2 Dependency
To use H2 in your Spring Boot project, you typically add it as a test scope dependency in your pom.xml (for Maven) or build.gradle (for Gradle).
This ensures it's only available during testing.
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>Spring Boot Auto-Config
One of Spring Boot's magic tricks is auto-configuration. When it detects H2 on the classpath during tests, it automatically configures an in-memory H2 database for you.
You often don't need to specify a database URL in application.properties for tests, making setup trivial!
User Entity & Repository
Let's consider a simple User entity and a UserRepository. We want to test if our repository correctly saves and retrieves users.
These are standard JPA components.
// User.java
package com.coddykit.demo;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
public User() {}
public User(String name, String email) {
this.name = name;
this.email = email;
}
// Getters and Setters
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
}
// UserRepository.java
package com.coddykit.demo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
User findByName(String name);
}@DataJpaTest with H2
Spring Boot provides @DataJpaTest specifically for testing JPA components. It auto-configures an in-memory database (like H2 if present) and an EntityManager.
It also rolls back transactions after each test, ensuring a clean state.
UserRepository Test Example
Here's how you might write an integration test for our UserRepository using H2 and @DataJpaTest:
package com.coddykit.demo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
import static org.assertj.core.api.Assertions.assertThat;
@DataJpaTest
class UserRepositoryTest {
@Autowired
private TestEntityManager entityManager;
@Autowired
private UserRepository userRepository;
@Test
void whenFindByName_thenReturnUser() {
// given
User alice = new User("Alice", "alice@example.com");
entityManager.persist(alice);
entityManager.flush();
// when
User found = userRepository.findByName(alice.getName());
// then
assertThat(found.getName()).isEqualTo(alice.getName());
assertThat(found.getEmail()).isEqualTo(alice.getEmail());
}
@Test
void whenInvalidName_thenReturnNull() {
// when
User found = userRepository.findByName("InvalidName");
// then
assertThat(found).isNull();
}
}Schema & Data Initialization
For more complex scenarios, you might need to pre-populate your in-memory database with a schema or initial data.
- Place
schema.sqlinsrc/test/resourcesfor DDL (Data Definition Language). - Place
data.sqlinsrc/test/resourcesfor DML (Data Manipulation Language).
Spring Boot will automatically pick these up for your tests.
Quick Check
Which of the following is NOT a primary benefit of using an embedded database like H2 for Spring Boot integration tests?
Recap & Next Steps
We've explored how embedded databases like H2 are invaluable for fast and isolated Spring Boot integration tests.
- They offer speed, isolation, and simplicity.
- Spring Boot auto-configures them with minimal effort.
@DataJpaTestsimplifies testing JPA repositories with these databases.- You can initialize schemas and data using
schema.sqlanddata.sql.
Next, you might explore testing RESTful APIs with MockMvc!
Часто задаваемые вопросы
Урок «Встроенные базы данных для тестов» бесплатный?
Да — полный текст урока «Встроенные базы данных для тестов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Testing Mastery: JUnit, Mockito & Integration Tests, подпишись на CoddyKit PRO. Курс Testing Mastery: JUnit, Mockito & Integration Tests содержит 4 уроков всего.
Чему я научусь в уроке «Встроенные базы данных для тестов»?
Настраивайте и используйте базы данных в памяти или встроенные базы данных для быстрого и изолированного интеграционного тестирования. Ты практикуешь Testing Mastery: JUnit, Mockito & Integration Tests с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Testing Mastery: JUnit, Mockito & Integration Tests?
Предыдущий опыт не требуется. Testing Mastery: JUnit, Mockito & Integration Tests на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Встроенные базы данных для тестов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Testing Mastery: JUnit, Mockito & Integration Tests?
Да. Каждый урок Testing Mastery: JUnit, Mockito & Integration Tests включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Инфраструктура тестового контекста Spring
- Тестирование RESTful API
- Встроенные базы данных для тестов
- Тестирование веб-слоёв с помощью @WebMvcTest и MockMvc