0
0
SpringbootHow-ToBeginner · 3 min read

How to Use @DataJpaTest in Spring Boot for JPA Testing

Use @DataJpaTest on a test class to configure Spring Boot to test JPA repositories with an in-memory database and rollback after each test. It sets up only the JPA components, making tests fast and focused on data access layers.
📐

Syntax

The @DataJpaTest annotation is placed on a test class to enable JPA repository testing with Spring Boot. It configures an in-memory database, scans for @Entity classes and Spring Data JPA repositories, and disables full auto-configuration.

  • @DataJpaTest: Activates JPA tests with rollback after each test.
  • Test class: Contains test methods for repository operations.
  • @Autowired repositories: Inject repositories to test CRUD operations.
java
@DataJpaTest
public class MyRepositoryTest {

    @Autowired
    private MyRepository repository;

    @Test
    void testRepositoryMethod() {
        // test code here
    }
}
💻

Example

This example shows a simple @DataJpaTest that tests saving and retrieving an entity using a Spring Data JPA repository. It uses an in-memory H2 database automatically configured by Spring Boot.

java
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import static org.assertj.core.api.Assertions.assertThat;

import javax.persistence.Entity;
import javax.persistence.Id;

@DataJpaTest
public class UserRepositoryTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    void testSaveAndFind() {
        User user = new User(1L, "Alice");
        userRepository.save(user);

        User found = userRepository.findById(1L).orElse(null);
        assertThat(found).isNotNull();
        assertThat(found.getName()).isEqualTo("Alice");
    }
}

interface UserRepository extends org.springframework.data.jpa.repository.JpaRepository<User, Long> {}

@Entity
class User {
    @Id
    private Long id;
    private String name;

    protected User() {}

    public User(Long id, String name) {
        this.id = id;
        this.name = name;
    }

    public Long getId() { return id; }
    public String getName() { return name; }
}
Output
Test passed: the user entity was saved and retrieved successfully.
⚠️

Common Pitfalls

Common mistakes when using @DataJpaTest include:

  • Expecting full application context: @DataJpaTest loads only JPA-related beans, so other beans are not available.
  • Not using rollback: Tests automatically rollback transactions, so data is not persisted between tests.
  • Missing @Entity or repository scanning: Ensure entities and repositories are in scanned packages or explicitly included.
  • Using external databases without configuration: By default, an in-memory database is used unless configured otherwise.
java
/* Wrong: Trying to autowire a service bean not loaded by @DataJpaTest */
@DataJpaTest
class WrongTest {
    @Autowired
    private SomeService service; // Fails: service bean not loaded
}

/* Right: Use @SpringBootTest for full context or mock the service */
@SpringBootTest
class CorrectTest {
    @Autowired
    private SomeService service; // Works
}
📊

Quick Reference

  • @DataJpaTest: Use for fast JPA repository tests with rollback.
  • Includes: @Entity scanning, Spring Data JPA repositories, in-memory DB.
  • Excludes: Full web or service layer beans.
  • Auto-rollbacks after each test method.
  • Use @AutoConfigureTestDatabase to override default DB.

Key Takeaways

Use @DataJpaTest to test JPA repositories with an in-memory database and automatic rollback.
It loads only JPA-related components, making tests fast and isolated from other layers.
Ensure your entities and repositories are in scanned packages or explicitly included.
Do not expect service or web beans to be available in @DataJpaTest context.
Override the default database with @AutoConfigureTestDatabase if needed.