Как организовать тестирование с базой данных, если её нельзя установить локально?

«Как организовать тестирование с базой данных, если её нельзя установить локально?» — вопрос из категории Тестирование, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для изоляции unit-тестов от внешней инфраструктуры БД используйте следующие подходы:

1. In-memory базы данных

  • H2 или SQLite — работают в оперативной памяти, не требуют установки.
  • Пример настройки H2 в Spring Boot тесте:
    @DataJpaTest
    @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
    @TestPropertySource(properties = {
    "spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1",
    "spring.datasource.driver-class-name=org.h2.Driver"
    })
    public class RepositoryTest {
    @Test
    public void testUserRepository() {
        // ... тестовые операции с БД
    }
    }

2. Mocking слоя доступа к данным

  • Используйте Mockito для заглушек репозиториев или DAO, чтобы не обращаться к реальной БД.

3. Testcontainers

  • Запускает реальные СУБД (PostgreSQL, MySQL) в Docker-контейнерах. Интегрируется с JUnit.
    @Testcontainers
    public class IntegrationTest {
    @Container
    static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:13");
    // ... использование контейнера в тестах
    }

Ключевой принцип: тесты должны быть быстрыми, воспроизводимыми и не зависеть от состояния внешних систем.