Testcontainers implementation for MongoDB that enables isolated database instances in Docker containers for Java unit testing
npx @tessl/cli install tessl/maven-org-testcontainers--mongodb@1.21.1Testcontainers MongoDB module provides Docker container implementations for running isolated MongoDB database instances during Java unit and integration testing. The module offers two container types: MongoDBContainer for the core MongoDB database with automatic replica set initialization, and MongoDBAtlasLocalContainer which combines MongoDB with Atlas Search and Vector Search capabilities.
Gradle:
testImplementation "org.testcontainers:mongodb:1.21.4"Maven:
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>mongodb</artifactId>
<version>1.21.4</version>
<scope>test</scope>
</dependency>import org.testcontainers.containers.MongoDBContainer;
import org.testcontainers.mongodb.MongoDBAtlasLocalContainer;
import org.testcontainers.utility.DockerImageName;import org.testcontainers.containers.MongoDBContainer;
// Create and start a MongoDB container
try (MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:7.0")) {
mongoDBContainer.start();
// Get connection string for your MongoDB driver
String connectionString = mongoDBContainer.getConnectionString();
// Or get a replica set URL with database name
String replicaSetUrl = mongoDBContainer.getReplicaSetUrl("mydb");
// Use the connection string with your MongoDB driver
// MongoClient mongoClient = MongoClients.create(connectionString);
}import org.testcontainers.mongodb.MongoDBAtlasLocalContainer;
// Create and start a MongoDB Atlas Local container
try (MongoDBAtlasLocalContainer container =
new MongoDBAtlasLocalContainer("mongodb/mongodb-atlas-local:7.0.9")) {
container.start();
// Get connection string
String connectionString = container.getConnectionString();
// Or get database-specific connection string
String dbConnectionString = container.getDatabaseConnectionString("mydb");
// Use with MongoDB driver to access Atlas Search features
// MongoClient mongoClient = MongoClients.create(connectionString);
}Both container classes extend GenericContainer from the Testcontainers core library, inheriting standard container lifecycle management, port mapping, network configuration, and Docker interaction capabilities. The containers are designed to be used with Java's try-with-resources statement for automatic cleanup.
MongoDBContainer automatically initializes a single-node replica set on startup, which is required for testing MongoDB multi-document transactions. The initialization process waits for the replica set to be ready before the container is considered started.
MongoDBAtlasLocalContainer combines the MongoDB database engine with MongoT (a sidecar process for Atlas Search powered by Apache Lucene), providing local testing capabilities for Atlas Search and Vector Search features without requiring a cloud Atlas deployment.
MongoDBContainer provides a Testcontainers implementation for running MongoDB database instances with automatic replica set initialization for transaction testing.
package org.testcontainers.containers;
public class MongoDBContainer extends GenericContainer<MongoDBContainer> {
// Constructors
/**
* Create a MongoDBContainer with default image mongo:4.0.10.
*
* @deprecated Use MongoDBContainer(DockerImageName) instead
*/
@Deprecated
public MongoDBContainer();
/**
* Create a MongoDBContainer with the specified Docker image name.
* Supported images: mongo, mongodb/mongodb-community-server, mongodb/mongodb-enterprise-server
*
* @param dockerImageName the Docker image name (e.g., "mongo:7.0")
*/
public MongoDBContainer(String dockerImageName);
/**
* Create a MongoDBContainer with the specified DockerImageName.
*
* @param dockerImageName the DockerImageName object
*/
public MongoDBContainer(DockerImageName dockerImageName);
// Connection Methods
/**
* Gets a connection string URL to the MongoDB instance.
* Unlike getReplicaSetUrl(), this does not include a database name.
*
* @return connection string in format "mongodb://host:port"
*/
public String getConnectionString();
/**
* Gets a replica set URL for the default "test" database.
*
* @return replica set URL in format "mongodb://host:port/test"
*/
public String getReplicaSetUrl();
/**
* Gets a replica set URL for the specified database.
*
* @param databaseName the name of the database
* @return replica set URL in format "mongodb://host:port/databaseName"
* @throws IllegalStateException if container is not running
*/
public String getReplicaSetUrl(String databaseName);
// Configuration Methods
/**
* Enables sharding on the MongoDB cluster.
* Must be called before starting the container.
*
* @return this MongoDBContainer instance for method chaining
*/
public MongoDBContainer withSharding();
}package org.testcontainers.containers;
/**
* Exception thrown when MongoDB replica set initialization fails.
*/
public static class MongoDBContainer.ReplicaSetInitializationException
extends RuntimeException {
/**
* Creates a new ReplicaSetInitializationException with the given error message.
*
* @param errorMessage description of the initialization failure
*/
ReplicaSetInitializationException(String errorMessage);
}mongo, mongodb/mongodb-community-server, and mongodb/mongodb-enterprise-server Docker imagesimport org.testcontainers.containers.MongoDBContainer;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
// Basic usage with transactions
try (MongoDBContainer container = new MongoDBContainer("mongo:7.0")) {
container.start();
String connectionString = container.getConnectionString();
try (MongoClient client = MongoClients.create(connectionString)) {
// Use client for database operations including transactions
// Replica set is automatically initialized and ready
}
}
// Using with specific database
try (MongoDBContainer container = new MongoDBContainer("mongo:7.0")) {
container.start();
String replicaSetUrl = container.getReplicaSetUrl("myapp");
try (MongoClient client = MongoClients.create(replicaSetUrl)) {
// Client is connected to "myapp" database
}
}
// Using with sharding enabled
try (MongoDBContainer container = new MongoDBContainer("mongo:7.0")) {
container.withSharding().start();
String connectionString = container.getConnectionString();
// Container now has sharding enabled
}MongoDBAtlasLocalContainer provides a Testcontainers implementation for MongoDB Atlas Local, which combines the MongoDB database engine with Atlas Search and Vector Search capabilities for local testing.
package org.testcontainers.mongodb;
public class MongoDBAtlasLocalContainer
extends GenericContainer<MongoDBAtlasLocalContainer> {
// Constructors
/**
* Create a MongoDBAtlasLocalContainer with the specified Docker image name.
* Supported image: mongodb/mongodb-atlas-local
*
* @param dockerImageName the Docker image name (e.g., "mongodb/mongodb-atlas-local:7.0.9")
*/
public MongoDBAtlasLocalContainer(String dockerImageName);
/**
* Create a MongoDBAtlasLocalContainer with the specified DockerImageName.
*
* @param dockerImageName the DockerImageName object
*/
public MongoDBAtlasLocalContainer(DockerImageName dockerImageName);
// Connection Methods
/**
* Gets the connection string to MongoDB.
* Includes the directConnection=true parameter required for Atlas Local.
*
* @return connection string in format "mongodb://host:port/?directConnection=true"
*/
public String getConnectionString();
/**
* Gets a database-specific connection string for the default "test" database.
*
* @return database connection string in format
* "mongodb://host:port/test?directConnection=true"
*/
public String getDatabaseConnectionString();
/**
* Gets a database-specific connection string for the specified database.
*
* @param databaseName the name of the database
* @return database connection string in format
* "mongodb://host:port/databaseName?directConnection=true"
* @throws IllegalStateException if container is not running
*/
public String getDatabaseConnectionString(String databaseName);
}directConnection=true parametermongodb/mongodb-atlas-local Docker imagesimport org.testcontainers.mongodb.MongoDBAtlasLocalContainer;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.MongoCollection;
import org.bson.Document;
// Basic usage
try (MongoDBAtlasLocalContainer container =
new MongoDBAtlasLocalContainer("mongodb/mongodb-atlas-local:7.0.9")) {
container.start();
String connectionString = container.getConnectionString();
try (MongoClient client = MongoClients.create(connectionString)) {
// Use client for database operations with Atlas Search
MongoDatabase database = client.getDatabase("test");
MongoCollection<Document> collection = database.getCollection("products");
// Create Atlas Search indexes and perform searches
// Note: Atlas Search is eventually consistent, may need polling
}
}
// Using with specific database
try (MongoDBAtlasLocalContainer container =
new MongoDBAtlasLocalContainer("mongodb/mongodb-atlas-local:7.0.9")) {
container.start();
String dbConnectionString = container.getDatabaseConnectionString("searchdb");
try (MongoClient client = MongoClients.create(dbConnectionString)) {
// Client is connected to "searchdb" database
// Use Atlas Search and Vector Search features
}
}Both MongoDBContainer and MongoDBAtlasLocalContainer inherit methods from GenericContainer in the Testcontainers core library:
// Start the container
public void start();
// Stop the container
public void stop();
// Check if container is running
public boolean isRunning();// Get the container host (typically "localhost")
public String getHost();
// Get the mapped host port for an internal container port
public Integer getMappedPort(int originalPort);
// Get the first mapped port
public Integer getFirstMappedPort();// Expose additional ports
public SELF withExposedPorts(Integer... ports);
// Set environment variables
public SELF withEnv(String key, String value);
// Set container command
public SELF withCommand(String... commandParts);
// Set wait strategy
public SELF waitingFor(WaitStrategy waitStrategy);// Execute command in running container
public Container.ExecResult execInContainer(String... command)
throws IOException, InterruptedException;Both containers implement AutoCloseable and can be used with try-with-resources:
try (MongoDBContainer container = new MongoDBContainer("mongo:7.0")) {
container.start();
// Use container
} // Automatically stopped and cleaned uporg.mongodb:mongodb-driver-sync) to your project to connect to the containerstest scope as it's intended for testing purposesdirectConnection=true parameter