Skip to main content

MongoDB Regression Testing with BitDive

Testing MongoDB applications in Java usually involves a trade-off:

  • Fongo / Mock Objects: Fast, but doesn't support complex Aggregations or newer Mongo features.
  • Testcontainers: Realistic, but slow and requires Docker cleanup.

BitDive offers Hybrid Replay: Keep the database real (Testcontainers) OR virtualize it (Record/Replay) depending on your need.

Strategy 1: Pure Virtualization (Fastest)

For complex read-heavy logic (e.g., massive Aggregation Pipelines), BitDive allows you to record the result set from production.

During the test:

  1. Your code executes the aggregate() query.
  2. BitDive intercepts the network call.
  3. BitDive returns the exact BSON documents captured during recording.

Use Case: Analytics dashboards, Reporting services.

Strategy 2: Hybrid State Verification (Most Robust)

For write-heavy logic, you want to verify that the state actually changed.

  1. BitDive initializes a Testcontainer with a known dataset (captured from prod).
  2. Run Test: Your code executes repository.save().
  3. Verify: BitDive asserts that the document in the Testcontainer matches the expected state.

Why drop Fongo?

Fongo (Fake Mongo) is a re-implementation of MongoDB in Java. It is often behind the official Mongo server versions. BitDive doesn't re-implement Mongo; it captures reliability from the actual driver interactions.

Example Configuration

# Example Replay Configuration
replay:
mode: HYBRID # Concept: Use Testcontainers for writes, Replay for reads
mongo:
containerImage: "mongo:6.0"
datasetId: "production-sample-v1"

This ensures your tests run against the exact version of MongoDB you use in production, with data derived from real user usage.

Next Steps