Bird
Raised Fist0
JUnittesting~5 mins

@DataJpaTest for repository testing in JUnit - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the purpose of the @DataJpaTest annotation in Spring Boot testing?

@DataJpaTest is used to test JPA repositories. It configures an in-memory database, scans for @Entity classes, and sets up Spring Data JPA components for testing repository layers only.

Click to reveal answer
beginner
Which database does @DataJpaTest use by default during tests?

By default, @DataJpaTest uses an embedded in-memory database like H2, HSQL, or Derby to run tests quickly without affecting the real database.

Click to reveal answer
intermediate
Does @DataJpaTest load the full Spring Boot application context?

No, @DataJpaTest loads only the components related to JPA repositories and entities. It does not load web layers or other beans, making tests faster and focused.

Click to reveal answer
intermediate
How can you override the default database used by @DataJpaTest?

You can override the default in-memory database by providing your own application.properties or application.yml file with datasource settings, or by using @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) to use the real database.

Click to reveal answer
beginner
What is a typical assertion you would write in a repository test using @DataJpaTest?

You typically assert that repository methods return expected data. For example, after saving an entity, you assert that findById() returns the saved entity, or that count() returns the correct number.

Click to reveal answer
What does @DataJpaTest automatically configure for your test?
ANo database, you must configure it manually
BThe full Spring Boot application context
COnly the web layer components
DAn embedded in-memory database and JPA repositories
Which annotation can you use to prevent @DataJpaTest from replacing your database with an in-memory one?
A@MockBean
B@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
C@SpringBootTest
D@Transactional
True or False: @DataJpaTest loads web controllers for testing.
AFalse
BTrue
COnly if specified
DDepends on Spring Boot version
What is the default transaction behavior of tests annotated with @DataJpaTest?
ATransactions must be managed manually
BNo transactions are used
CEach test runs in a transaction that rolls back after completion
DTransactions commit automatically after each test
Which of the following is NOT a benefit of using @DataJpaTest?
ATesting the full application including UI and services
BFaster tests by loading only repository-related beans
CAutomatic rollback of transactions after each test
DUsing an embedded in-memory database by default
Explain how @DataJpaTest helps in testing Spring Data JPA repositories.
Think about what parts of the application are loaded and how the database is handled.
You got /4 concepts.
    Describe how to configure @DataJpaTest to use your real database instead of the default in-memory one.
    Consider annotations and configuration files.
    You got /3 concepts.

      Practice

      (1/5)
      1. What is the primary purpose of using @DataJpaTest in Spring Boot testing?
      easy
      A. To perform integration testing with external APIs
      B. To test the entire Spring Boot application including web layers
      C. To test only the service layer without database access
      D. To test only the JPA repositories with an in-memory database setup

      Solution

      1. Step 1: Understand the role of @DataJpaTest

        @DataJpaTest is designed to test JPA repositories specifically, setting up only database-related components.
      2. Step 2: Recognize the default database setup

        It uses an in-memory database by default to keep tests fast and isolated.
      3. Final Answer:

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

        @DataJpaTest = repository testing with in-memory DB [OK]
      Hint: Remember @DataJpaTest focuses on repositories only [OK]
      Common Mistakes:
      • Thinking it tests the whole application
      • Confusing it with @SpringBootTest
      • Assuming it tests service or controller layers
      2. Which annotation is NOT typically used together with @DataJpaTest for repository testing?
      easy
      A. @AutoConfigureTestDatabase
      B. @SpringBootTest
      C. @Transactional
      D. @MockBean

      Solution

      1. Step 1: Identify annotations used with @DataJpaTest

        @DataJpaTest automatically includes @Transactional and often uses @AutoConfigureTestDatabase to control DB setup.
      2. Step 2: Understand @SpringBootTest role

        @SpringBootTest loads the full application context, which is not typical with @DataJpaTest that loads a slice for repositories.
      3. Final Answer:

        @SpringBootTest -> Option B
      4. Quick Check:

        @DataJpaTest excludes full context, so no @SpringBootTest [OK]
      Hint: Full app context uses @SpringBootTest, not @DataJpaTest [OK]
      Common Mistakes:
      • Using @SpringBootTest with @DataJpaTest unnecessarily
      • Confusing @MockBean usage in repository tests
      • Ignoring transactional rollback behavior
      3. Given the following test code snippet using @DataJpaTest:
      @DataJpaTest
      public class UserRepositoryTest {
        @Autowired
        private UserRepository userRepository;
      
        @Test
        void testSaveAndFind() {
          User user = new User(null, "Alice");
          userRepository.save(user);
          Optional<User> found = userRepository.findByName("Alice");
          assertTrue(found.isPresent());
        }
      }
      What will be the test result when executed?
      medium
      A. Test fails due to missing @Transactional annotation
      B. Test fails because the database is not initialized
      C. Test passes because the user is saved and found correctly
      D. Test fails because userRepository is null

      Solution

      1. Step 1: Analyze @DataJpaTest behavior

        @DataJpaTest sets up an in-memory database and configures repositories automatically with transactional rollback.
      2. Step 2: Check test logic

        The test saves a user and then finds it by name. Since the repository is autowired and database is in-memory, the user will be found.
      3. Final Answer:

        Test passes because the user is saved and found correctly -> Option C
      4. Quick Check:

        Save + find with @DataJpaTest = pass [OK]
      Hint: In-memory DB + @DataJpaTest means save/find works in tests [OK]
      Common Mistakes:
      • Assuming database is empty or uninitialized
      • Forgetting @DataJpaTest provides @Transactional by default
      • Thinking repository needs manual initialization
      4. Consider this test class using @DataJpaTest:
      @DataJpaTest
      public class ProductRepositoryTest {
        @Autowired
        private ProductRepository productRepository;
      
        @Test
        void testFindById() {
          Product product = new Product(1L, "Book");
          productRepository.save(product);
          Product found = productRepository.findById(1L).orElse(null);
          assertNotNull(found);
        }
      }
      The test fails with an AssertionError on assertNotNull(found). What is the most likely cause?
      medium
      A. The Product entity is missing an @Entity annotation
      B. The productRepository is not autowired correctly
      C. The save method does not persist the entity in @DataJpaTest
      D. The test method is missing @Transactional annotation

      Solution

      1. Step 1: Check entity configuration

        If the Product class lacks @Entity, JPA won't map it, so save won't persist anything.
      2. Step 2: Understand repository autowiring and transactions

        @DataJpaTest autowires repositories and runs tests in transactions by default, so these are unlikely causes.
      3. Final Answer:

        The Product entity is missing an @Entity annotation -> Option A
      4. Quick Check:

        Missing @Entity means no persistence [OK]
      Hint: Always check @Entity on classes for JPA persistence [OK]
      Common Mistakes:
      • Assuming @Transactional is missing in @DataJpaTest
      • Thinking save() doesn't work in tests
      • Ignoring entity annotations
      5. You want to test a custom query method in your repository using @DataJpaTest. The method returns a list of users with age greater than a given value. Which of the following is the best practice to ensure your test is reliable and isolated?
      hard
      A. Use @DataJpaTest with an in-memory database and insert test users before querying
      B. Use @SpringBootTest and connect to the production database for real data
      C. Mock the repository method using @MockBean and verify the return values
      D. Write the test without inserting data, assuming the database has users

      Solution

      1. Step 1: Understand test isolation with @DataJpaTest

        @DataJpaTest uses an in-memory database that starts empty for each test, so you must insert test data.
      2. Step 2: Avoid external dependencies and mocks for repository tests

        Using production DB or mocks defeats the purpose of repository testing with real JPA behavior.
      3. Final Answer:

        Use @DataJpaTest with an in-memory database and insert test users before querying -> Option A
      4. Quick Check:

        Insert test data in @DataJpaTest for reliable queries [OK]
      Hint: Always insert test data in @DataJpaTest for accurate results [OK]
      Common Mistakes:
      • Connecting to production DB in tests
      • Relying on existing data without setup
      • Mocking repository methods instead of real queries
      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