Bird
Raised Fist0
JUnittesting~10 mins

@DataJpaTest for repository testing in JUnit - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to annotate the test class for JPA repository testing.

JUnit
@[1]
public class UserRepositoryTest {
    // test methods
}
Drag options to blanks, or click blank then click option'
AWebMvcTest
BDataJpaTest
CSpringBootTest
DMockBean
Attempts:
3 left
💡 Hint
Common Mistakes
Using @SpringBootTest which loads the full context instead of a slice for JPA.
Using @WebMvcTest which is for controller layer testing.
2fill in blank
medium

Complete the code to inject the repository into the test class.

JUnit
@Autowired
private [1] userRepository;
Drag options to blanks, or click blank then click option'
AUserRepository
BEntityManager
CUserService
DUserController
Attempts:
3 left
💡 Hint
Common Mistakes
Injecting UserService or UserController instead of the repository.
Injecting EntityManager directly without repository.
3fill in blank
hard

Fix the error in the test method to save and verify a user entity.

JUnit
@Test
void testSaveUser() {
    User user = new User("john", "john@example.com");
    userRepository.[1](user);
    assertThat(userRepository.findById(user.getId())).isPresent();
}
Drag options to blanks, or click blank then click option'
AsaveUser
Binsert
Csave
Dpersist
Attempts:
3 left
💡 Hint
Common Mistakes
Using saveUser which is not a JpaRepository method.
Using persist which is an EntityManager method, not repository.
4fill in blank
hard

Fill both blanks to write a test that finds a user by email.

JUnit
@Test
void testFindByEmail() {
    User user = new User("anna", "anna@example.com");
    userRepository.save(user);
    Optional<User> found = userRepository.[1]("anna@example.com");
    assertThat(found.[2]()).isTrue();
}
Drag options to blanks, or click blank then click option'
AfindByEmail
BisEmpty
CisPresent
DgetEmail
Attempts:
3 left
💡 Hint
Common Mistakes
Using isEmpty() which checks for absence, not presence.
Using getEmail() which is a getter, not an Optional method.
5fill in blank
hard

Fill all three blanks to write a test that deletes a user and verifies deletion.

JUnit
@Test
void testDeleteUser() {
    User user = new User("mike", "mike@example.com");
    userRepository.save(user);
    userRepository.[1](user);
    Optional<User> deleted = userRepository.[2](user.getId());
    assertThat(deleted.[3]()).isFalse();
}
Drag options to blanks, or click blank then click option'
Adelete
BfindById
CisPresent
Dremove
Attempts:
3 left
💡 Hint
Common Mistakes
Using remove() which is not a JpaRepository method.
Asserting isPresent() is true after deletion, which is incorrect.

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