Bird
Raised Fist0
Spring Bootframework~10 mins

@DataJpaTest for repository testing in Spring Boot - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - @DataJpaTest for repository testing
Start Test Class
↓
@DataJpaTest Annotation
↓
Spring Boot Loads In-Memory DB
↓
Inject Repository Bean
↓
Run Repository Methods
↓
Verify Results
↓
Test Ends
The test class annotated with @DataJpaTest loads an in-memory database and injects the repository to run and verify database operations.
Execution Sample
Spring Boot
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.beans.factory.annotation.Autowired;
@DataJpaTest
class UserRepositoryTest {
  @Autowired
  UserRepository repo;
  // test methods here
}
This code sets up a test class that uses @DataJpaTest to test UserRepository with an in-memory database.
Execution Table
StepActionSpring Boot BehaviorRepository StateTest Output
1Test class startsSpring Boot prepares test contextRepository bean not yet injectedNo output
2@DataJpaTest triggers in-memory DB setupH2 database startsRepository bean created and injectedNo output
3Repository method called (e.g., save)Transaction startsEntity saved in in-memory DBEntity saved successfully
4Repository method called (e.g., findById)Query executed on in-memory DBEntity retrievedEntity returned
5Assertions runTest framework checks resultsRepository state unchangedPass or Fail based on assertions
6Test endsTransaction rolls back automaticallyIn-memory DB clearedTest context closed
💡 Test ends after assertions; in-memory DB is cleared to keep tests isolated.
Variable Tracker
VariableStartAfter Step 3After Step 4Final
Repository BeannullInjected instanceInjected instanceInjected instance
In-Memory DBemptyContains saved entityContains saved entityempty (rolled back)
EntitynullSaved entity instanceRetrieved entity instancenull (rolled back)
Key Moments - 3 Insights
Why does the database get cleared after the test?
Because @DataJpaTest runs each test in a transaction that rolls back at the end, ensuring no data persists between tests (see Step 6 in execution_table).
Is the real database used during @DataJpaTest?
No, @DataJpaTest uses an in-memory database like H2 by default to keep tests fast and isolated (see Step 2 in execution_table).
How does the repository get available in the test?
Spring Boot injects the repository bean automatically into the test class because of @DataJpaTest and @Autowired (see Step 2 and 3 in execution_table).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what happens at Step 3?
ARepository method saves an entity in the in-memory DB
BTest ends and database is cleared
CRepository bean is injected
DAssertions are run
💡 Hint
Check the 'Action' and 'Repository State' columns at Step 3 in the execution_table.
At which step does Spring Boot start the in-memory database?
AStep 1
BStep 2
CStep 4
DStep 6
💡 Hint
Look for 'H2 database starts' in the 'Spring Boot Behavior' column.
If the transaction did not roll back after the test, what would change in variable_tracker?
AIn-Memory DB would remain empty
BRepository Bean would be null
CIn-Memory DB would still contain saved entities after test
DEntity variable would be null at start
💡 Hint
Refer to the 'In-Memory DB' row in variable_tracker and Step 6 in execution_table.
Concept Snapshot
@DataJpaTest sets up an in-memory database and injects repository beans for testing.
Each test runs in a transaction that rolls back after completion.
This keeps tests isolated and fast without affecting real data.
Use @Autowired to get repository instances in your test class.
Run repository methods and assert results as usual.
The in-memory DB resets after each test automatically.
Full Transcript
When you write a test class with @DataJpaTest, Spring Boot starts an in-memory database like H2 and injects your repository bean. You can then call repository methods such as save or findById. Each test runs inside a transaction that automatically rolls back when the test finishes, so no data stays in the database. This keeps tests clean and isolated. The repository bean is available because Spring Boot creates and injects it for you. After running your assertions, the test ends and the in-memory database clears. This process helps you test your database code quickly without touching your real database.

Practice

(1/5)
1. What is the main purpose of using @DataJpaTest in Spring Boot?
easy
A. To test JPA repositories with an in-memory database setup
B. To test the entire Spring Boot application including web layer
C. To configure security settings for the application
D. To run integration tests with external APIs

Solution

  1. Step 1: Understand the role of @DataJpaTest

    @DataJpaTest is designed to test only the JPA repository layer, not the full application.
  2. Step 2: Recognize the default setup

    It sets up an in-memory database automatically to test repository methods quickly and in isolation.
  3. Final Answer:

    To test JPA repositories with an in-memory database setup -> Option A
  4. Quick Check:

    @DataJpaTest = repository testing with in-memory DB [OK]
Hint: Remember @DataJpaTest focuses only on JPA repositories [OK]
Common Mistakes:
  • Thinking it tests the full application context
  • Confusing it with @SpringBootTest
  • Assuming it configures web or security layers
2. Which of the following is the correct way to annotate a test class to use @DataJpaTest?
easy
A. @RepositoryTest public class MyRepositoryTest {}
B. @SpringBootTest public class MyRepositoryTest {}
C. @DataJpaTest public class MyRepositoryTest {}
D. @EnableJpaRepositories public class MyRepositoryTest {}

Solution

  1. Step 1: Identify the correct annotation for JPA repository testing

    @DataJpaTest is the dedicated annotation for testing JPA repositories.
  2. Step 2: Check the syntax usage

    The annotation is placed directly above the test class declaration as shown in @DataJpaTest public class MyRepositoryTest {}.
  3. Final Answer:

    @DataJpaTest public class MyRepositoryTest {} -> Option C
  4. Quick Check:

    Correct annotation usage = @DataJpaTest public class MyRepositoryTest {} [OK]
Hint: Use @DataJpaTest directly on the test class [OK]
Common Mistakes:
  • Using @SpringBootTest instead of @DataJpaTest
  • Using non-existent @RepositoryTest annotation
  • Confusing configuration annotations with test annotations
3. Given the following repository test code using @DataJpaTest, what will be the output of System.out.println(users.size())?
@DataJpaTest
public class UserRepositoryTest {
  @Autowired
  private UserRepository userRepository;

  @Test
  void testSaveAndFind() {
    User user = new User(null, "Alice");
    userRepository.save(user);
    List<User> users = userRepository.findAll();
    System.out.println(users.size());
  }
}
medium
A. 1
B. 0
C. NullPointerException
D. Compilation error

Solution

  1. Step 1: Analyze the test method behavior

    The test saves one User entity to the repository, then fetches all users.
  2. Step 2: Understand @DataJpaTest behavior

    @DataJpaTest uses an in-memory database, so the saved user is stored and retrievable within the test.
  3. Final Answer:

    1 -> Option A
  4. Quick Check:

    Saved one user, findAll returns list size 1 [OK]
Hint: Saved entities appear in findAll during @DataJpaTest [OK]
Common Mistakes:
  • Assuming the database is empty after save
  • Expecting NullPointerException due to missing ID
  • Confusing @DataJpaTest with no database setup
4. You wrote a test with @DataJpaTest but it fails with a BeanCreationException related to missing DataSource. What is the most likely cause?
medium
A. You did not annotate the test class with @SpringBootTest
B. You forgot to include an in-memory database dependency like H2
C. You used @DataJpaTest on a non-repository class
D. You did not add @Autowired to the repository field

Solution

  1. Step 1: Understand the error cause

    BeanCreationException for DataSource usually means Spring cannot find a database connection.
  2. Step 2: Check dependencies for @DataJpaTest

    @DataJpaTest uses an in-memory database by default, but you must include a dependency like H2 in your project.
  3. Final Answer:

    You forgot to include an in-memory database dependency like H2 -> Option B
  4. Quick Check:

    Missing DB dependency causes DataSource error [OK]
Hint: Add H2 dependency for @DataJpaTest to create DataSource [OK]
Common Mistakes:
  • Confusing @DataJpaTest with @SpringBootTest requirement
  • Ignoring missing database dependencies
  • Assuming @Autowired omission causes DataSource error
5. You want to test a repository method that uses a custom query with @Query annotation. How can you ensure @DataJpaTest loads this method correctly and your test verifies it?
hard
A. Add @EnableJpaRepositories to the test class to enable custom queries
B. Use @SpringBootTest instead because @DataJpaTest does not support custom queries
C. Manually configure the EntityManager in the test to run the query
D. Write a test method in a @DataJpaTest class that calls the custom query method and asserts the result

Solution

  1. Step 1: Understand @DataJpaTest capabilities

    @DataJpaTest loads repository beans including custom query methods annotated with @Query.
  2. Step 2: Write a test method to call and assert the custom query

    Simply call the repository method in your test and check the returned data matches expectations.
  3. Final Answer:

    Write a test method in a @DataJpaTest class that calls the custom query method and asserts the result -> Option D
  4. Quick Check:

    @DataJpaTest supports custom queries; test them directly [OK]
Hint: Test custom queries directly in @DataJpaTest methods [OK]
Common Mistakes:
  • Thinking @DataJpaTest cannot run custom queries
  • Overcomplicating with manual EntityManager setup
  • Adding unnecessary annotations like @EnableJpaRepositories
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard