0
0
JUnittesting~20 mins

In-memory database testing in JUnit - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
In-Memory DB Testing Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
What is the output of this JUnit test using H2 in-memory database?
Consider this JUnit 5 test that uses H2 in-memory database to insert and query a user count. What will be the printed output?
JUnit
import org.junit.jupiter.api.*;
import java.sql.*;

public class UserCountTest {
    private static Connection conn;

    @BeforeAll
    static void setup() throws SQLException {
        conn = DriverManager.getConnection("jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1");
        try (Statement stmt = conn.createStatement()) {
            stmt.execute("CREATE TABLE users(id INT PRIMARY KEY, name VARCHAR(100))");
            stmt.execute("INSERT INTO users VALUES(1, 'Alice'), (2, 'Bob')");
        }
    }

    @Test
    void testUserCount() throws SQLException {
        try (Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM users")) {
            if (rs.next()) {
                System.out.println(rs.getInt(1));
            }
        }
    }

    @AfterAll
    static void teardown() throws SQLException {
        conn.close();
    }
}
A1
B2
C0
DSQLException thrown
Attempts:
2 left
💡 Hint
Think about how many rows were inserted before the count query.
assertion
intermediate
1:30remaining
Which assertion correctly verifies the number of rows in an in-memory database table?
Given a ResultSet rs from executing SELECT COUNT(*) FROM users, which JUnit assertion correctly checks that the count is 5?
JUnit
int count = 0;
if (rs.next()) {
    count = rs.getInt(1);
}
AassertTrue(count == 5);
BassertFalse(count != 5);
CassertEquals(5, count);
DassertNull(count);
Attempts:
2 left
💡 Hint
Use the assertion that compares expected and actual values directly.
🔧 Debug
advanced
2:30remaining
Why does this in-memory database test fail with "Table not found" error?
This JUnit test using H2 in-memory database fails with an error: "Table 'users' not found". What is the most likely cause?
JUnit
import org.junit.jupiter.api.*;
import java.sql.*;

public class UserTest {
    private Connection conn;

    @BeforeEach
    void setup() throws SQLException {
        conn = DriverManager.getConnection("jdbc:h2:mem:testdb");
        try (Statement stmt = conn.createStatement()) {
            stmt.execute("CREATE TABLE users(id INT PRIMARY KEY, name VARCHAR(100))");
        }
        conn.close();
    }

    @Test
    void testInsert() throws SQLException {
        conn = DriverManager.getConnection("jdbc:h2:mem:testdb");
        try (Statement stmt = conn.createStatement()) {
            stmt.execute("INSERT INTO users VALUES(1, 'Alice')");
        }
    }

    @AfterEach
    void teardown() throws SQLException {
        conn.close();
    }
}
AThe connection URL lacks DB_CLOSE_DELAY=-1, so the table is dropped after setup method ends.
BThe table name 'users' is reserved and cannot be used.
CThe test method does not commit the transaction, so table is invisible.
DThe @BeforeEach method is not executed before the test.
Attempts:
2 left
💡 Hint
In-memory H2 databases are destroyed when the last connection closes unless configured otherwise.
framework
advanced
1:00remaining
Which JUnit 5 annotation is best to initialize an in-memory database once for all tests in a class?
You want to create and populate an H2 in-memory database once before all tests run and close it after all tests finish. Which annotation should you use for the setup method?
A@BeforeAll
B@BeforeEach
C@AfterEach
D@AfterAll
Attempts:
2 left
💡 Hint
Think about running setup only once before any tests start.
🧠 Conceptual
expert
2:00remaining
What is the main advantage of using an in-memory database for integration testing?
Why do many developers prefer using in-memory databases like H2 or HSQLDB for integration tests instead of connecting to a real external database?
AIn-memory databases require no setup or teardown, so tests never need cleanup.
BIn-memory databases support all production database features exactly, so tests are always identical to production.
CIn-memory databases automatically generate test data without manual insertion.
DIn-memory databases are faster and isolate tests from external dependencies, improving test reliability and speed.
Attempts:
2 left
💡 Hint
Consider speed and test environment isolation benefits.