0Pricing
Testing Mastery: JUnit, Mockito & Integration Tests · Lezione

Database incorporati per i test

Configuri e utilizzi database in memoria o incorporati per eseguire test di integrazione rapidi e isolati.

Database incorporati per i test è una lezione Testing Mastery: JUnit, Mockito & Integration Tests gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Testing Mastery: JUnit, Mockito & Integration Tests, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Testing Mastery: JUnit, Mockito & Integration Tests include 4 lezioni in totale.

Parti di questa lezione non sono ancora state tradotte e vengono mostrate in inglese.

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.sql in src/test/resources for DDL (Data Definition Language).
  • Place data.sql in src/test/resources for 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.
  • @DataJpaTest simplifies testing JPA repositories with these databases.
  • You can initialize schemas and data using schema.sql and data.sql.

Next, you might explore testing RESTful APIs with MockMvc!

Domande Frequenti

La lezione «Database incorporati per i test» è gratuita?

Sì — il testo completo di «Database incorporati per i test» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Testing Mastery: JUnit, Mockito & Integration Tests, passa a CoddyKit PRO. Il corso Testing Mastery: JUnit, Mockito & Integration Tests include 4 lezioni in totale.

Cosa imparerò in «Database incorporati per i test»?

Configuri e utilizzi database in memoria o incorporati per eseguire test di integrazione rapidi e isolati. Eserciti Testing Mastery: JUnit, Mockito & Integration Tests con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Testing Mastery: JUnit, Mockito & Integration Tests?

Non è richiesta alcuna esperienza precedente. Testing Mastery: JUnit, Mockito & Integration Tests su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Database incorporati per i test»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Testing Mastery: JUnit, Mockito & Integration Tests?

Sì. Ogni lezione Testing Mastery: JUnit, Mockito & Integration Tests include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Framework del contesto di test di Spring
  2. Testare le API RESTful
  3. Database incorporati per i test
  4. Testare i livelli web con @WebMvcTest e MockMvc
← Torna a Testing Mastery: JUnit, Mockito & Integration Tests