You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2020/11/03 18:39:18 UTC

[camel] branch master updated: Move the MongoDB test infrastructure from CKC (#4557)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/master by this push:
     new 22f5c3d  Move the MongoDB test infrastructure from CKC (#4557)
22f5c3d is described below

commit 22f5c3d26d112a361f2d2907931f168938ff19ad
Author: Otavio Rodolfo Piske <or...@users.noreply.github.com>
AuthorDate: Tue Nov 3 19:34:04 2020 +0100

    Move the MongoDB test infrastructure from CKC (#4557)
    
    Also adjust the tests from the camel-mongodb and camel-mongodb-gridfs to
    use the reusable test infra.
---
 components/camel-mongodb-gridfs/pom.xml            | 19 ++++-
 .../mongodb/gridfs/AbstractMongoDbTest.java        | 24 ++----
 .../component/mongodb/gridfs/MongoDbContainer.java | 85 ---------------------
 components/camel-mongodb/pom.xml                   | 26 ++++++-
 .../component/mongodb/AbstractMongoDbTest.java     | 25 ++----
 .../mongodb/MongoDbConnectionBeansTest.java        |  9 ++-
 .../camel/component/mongodb/MongoDbContainer.java  | 83 --------------------
 .../mongodb/MongoDbFindOperationTest.java          | 88 +++++++++++++++++++++-
 .../mongodb/meta/MongoDbMetaExtensionTest.java     |  6 +-
 .../verifier/MongoDbVerifierExtensionTest.java     |  8 +-
 parent/pom.xml                                     |  5 ++
 test-infra/camel-test-infra-mongodb/pom.xml        | 64 ++++++++++++++++
 .../src/main/resources/META-INF/MANIFEST.MF        |  0
 .../services/MongoDBLocalContainerService.java     | 70 +++++++++++++++++
 .../mongodb/services/MongoDBRemoteService.java     | 40 ++++++++++
 .../infra/mongodb/services/MongoDBService.java     | 50 ++++++++++++
 .../mongodb/services/MongoDBServiceFactory.java    | 44 +++++++++++
 test-infra/pom.xml                                 |  1 +
 18 files changed, 431 insertions(+), 216 deletions(-)

diff --git a/components/camel-mongodb-gridfs/pom.xml b/components/camel-mongodb-gridfs/pom.xml
index cd98f5f..8147e5e 100644
--- a/components/camel-mongodb-gridfs/pom.xml
+++ b/components/camel-mongodb-gridfs/pom.xml
@@ -60,10 +60,27 @@
             <version>${mongo-java-driver-version}</version>
         </dependency>
 
+        <!-- test infra -->
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-infra-common</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-infra-mongodb</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+
         <!-- test -->
         <dependency>
             <groupId>org.apache.camel</groupId>
-            <artifactId>camel-testcontainers-junit5</artifactId>
+            <artifactId>camel-test-junit5</artifactId>
             <scope>test</scope>
         </dependency>
 
diff --git a/components/camel-mongodb-gridfs/src/test/java/org/apache/camel/component/mongodb/gridfs/AbstractMongoDbTest.java b/components/camel-mongodb-gridfs/src/test/java/org/apache/camel/component/mongodb/gridfs/AbstractMongoDbTest.java
index 2f65fc7..64a9365 100644
--- a/components/camel-mongodb-gridfs/src/test/java/org/apache/camel/component/mongodb/gridfs/AbstractMongoDbTest.java
+++ b/components/camel-mongodb-gridfs/src/test/java/org/apache/camel/component/mongodb/gridfs/AbstractMongoDbTest.java
@@ -17,19 +17,22 @@
 package org.apache.camel.component.mongodb.gridfs;
 
 import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
 import com.mongodb.client.gridfs.GridFSBucket;
 import com.mongodb.client.gridfs.GridFSBuckets;
 import org.apache.camel.CamelContext;
+import org.apache.camel.test.infra.mongodb.services.MongoDBService;
+import org.apache.camel.test.infra.mongodb.services.MongoDBServiceFactory;
 import org.apache.camel.test.junit5.CamelTestSupport;
-import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 public abstract class AbstractMongoDbTest extends CamelTestSupport {
+    @RegisterExtension
+    public static MongoDBService service = MongoDBServiceFactory.createService();
 
     protected static final String FILE_NAME = "filename.for.db.txt";
     protected static final String FILE_DATA = "This is some stuff to go into the db";
-    protected static MongoDbContainer container;
     protected MongoClient mongo;
     protected GridFSBucket gridFSBucket;
 
@@ -37,19 +40,6 @@ public abstract class AbstractMongoDbTest extends CamelTestSupport {
         return this.getClass().getSimpleName();
     }
 
-    @BeforeAll
-    public static void doBeforeAll() {
-        container = new MongoDbContainer();
-        container.start();
-    }
-
-    @AfterAll
-    public static void doAfterAll() {
-        if (container != null) {
-            container.stop();
-        }
-    }
-
     @Override
     @AfterEach
     public void tearDown() throws Exception {
@@ -60,7 +50,7 @@ public abstract class AbstractMongoDbTest extends CamelTestSupport {
 
     @Override
     protected CamelContext createCamelContext() throws Exception {
-        mongo = container.createClient();
+        mongo = MongoClients.create(service.getReplicaSetUrl());
         gridFSBucket = GridFSBuckets.create(mongo.getDatabase("test"), getBucket());
 
         CamelContext context = super.createCamelContext();
diff --git a/components/camel-mongodb-gridfs/src/test/java/org/apache/camel/component/mongodb/gridfs/MongoDbContainer.java b/components/camel-mongodb-gridfs/src/test/java/org/apache/camel/component/mongodb/gridfs/MongoDbContainer.java
deleted file mode 100644
index 108a449..0000000
--- a/components/camel-mongodb-gridfs/src/test/java/org/apache/camel/component/mongodb/gridfs/MongoDbContainer.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.mongodb.gridfs;
-
-import com.mongodb.client.MongoClient;
-import com.mongodb.client.MongoClients;
-import org.bson.Document;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testcontainers.containers.GenericContainer;
-import org.testcontainers.containers.output.Slf4jLogConsumer;
-import org.testcontainers.containers.wait.strategy.Wait;
-
-public class MongoDbContainer extends GenericContainer {
-    private static final Logger LOGGER = LoggerFactory.getLogger(MongoDbContainer.class);
-    private static final String CONTAINER_NAME = "mongo";
-    private static final int MONGODB_PORT = 27017;
-    private static final String MONGO_IMAGE = "mongo:4.0";
-
-    public MongoDbContainer() {
-        super(MONGO_IMAGE);
-
-        setWaitStrategy(Wait.forListeningPort());
-
-        withNetworkAliases(CONTAINER_NAME);
-        withExposedPorts(MONGODB_PORT);
-        withLogConsumer(new Slf4jLogConsumer(LOGGER));
-        withCommand(
-                "--replSet", "replicationName",
-                "--oplogSize", "5000",
-                "--syncdelay", "0",
-                "--noauth",
-                "--noprealloc",
-                "--smallfiles");
-    }
-
-    @Override
-    public void start() {
-        super.start();
-
-        Document d = MongoClients.create(getConnectionURI())
-                .getDatabase("admin")
-                .runCommand(new Document("replSetInitiate", new Document()));
-
-        LOGGER.info("replSetInitiate: {}", d);
-        LOGGER.info("waiting to become master");
-
-        try {
-            execInContainer(
-                    "/bin/bash",
-                    "-c",
-                    "until mongo --eval \"printjson(rs.isMaster())\" | grep ismaster | grep true > /dev/null 2>&1; do sleep 1; done");
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-
-        LOGGER.info("started");
-    }
-
-    public String getConnectionAddress() {
-        return getContainerIpAddress() + ":" + getMappedPort(MONGODB_PORT);
-    }
-
-    public String getConnectionURI() {
-        return "mongodb://" + getConnectionAddress();
-    }
-
-    public MongoClient createClient() {
-        return MongoClients.create(getConnectionURI());
-    }
-}
diff --git a/components/camel-mongodb/pom.xml b/components/camel-mongodb/pom.xml
index 3373730..eede22a 100644
--- a/components/camel-mongodb/pom.xml
+++ b/components/camel-mongodb/pom.xml
@@ -64,12 +64,36 @@
             <version>${mongo-java-driver-version}</version>
         </dependency>
 
+        <!-- test infra -->
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-infra-common</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-infra-mongodb</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+
         <!-- test dependencies -->
         <dependency>
             <groupId>org.apache.camel</groupId>
-            <artifactId>camel-testcontainers-spring-junit5</artifactId>
+            <artifactId>camel-test-junit5</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-spring-junit5</artifactId>
             <scope>test</scope>
         </dependency>
+
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
diff --git a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/AbstractMongoDbTest.java b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/AbstractMongoDbTest.java
index 9482b56..bd48b68 100644
--- a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/AbstractMongoDbTest.java
+++ b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/AbstractMongoDbTest.java
@@ -19,29 +19,33 @@ package org.apache.camel.component.mongodb;
 import java.util.Formatter;
 
 import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
 import com.mongodb.client.MongoCollection;
 import com.mongodb.client.MongoDatabase;
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.test.infra.mongodb.services.MongoDBService;
+import org.apache.camel.test.infra.mongodb.services.MongoDBServiceFactory;
 import org.apache.camel.test.junit5.CamelTestSupport;
 import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.bson.Document;
-import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public abstract class AbstractMongoDbTest extends CamelTestSupport {
 
+    @RegisterExtension
+    public static MongoDBService service = MongoDBServiceFactory.createService();
+
     protected static final String SCHEME = "mongodb";
     protected static final String USER = "test-user";
     protected static final String PASSWORD = "test-pwd";
 
-    protected static MongoDbContainer container;
     protected static MongoClient mongo;
     protected static MongoDatabase db;
     protected static MongoCollection<Document> testCollection;
@@ -51,24 +55,11 @@ public abstract class AbstractMongoDbTest extends CamelTestSupport {
     protected static String testCollectionName;
     protected static String dynamicCollectionName;
 
-    @BeforeAll
-    public static void doBeforeAll() {
-        container = new MongoDbContainer();
-        container.start();
-    }
-
-    @AfterAll
-    public static void doAfterAll() {
-        if (container != null) {
-            container.stop();
-        }
-    }
-
     @Override
     public void doPreSetup() throws Exception {
         super.doPreSetup();
 
-        mongo = container.createClient();
+        mongo = MongoClients.create(service.getReplicaSetUrl());
         db = mongo.getDatabase(dbName);
     }
 
diff --git a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbConnectionBeansTest.java b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbConnectionBeansTest.java
index 1a47bde..eac74a9 100644
--- a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbConnectionBeansTest.java
+++ b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbConnectionBeansTest.java
@@ -17,6 +17,7 @@
 package org.apache.camel.component.mongodb;
 
 import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
 import org.apache.camel.Endpoint;
 import org.junit.jupiter.api.Test;
 
@@ -28,7 +29,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 public class MongoDbConnectionBeansTest extends AbstractMongoDbTest {
     @Test
     public void checkConnectionFromProperties() {
-        MongoClient client = container.createClient();
+        MongoClient client = MongoClients.create(service.getReplicaSetUrl());
 
         context.getComponent(SCHEME, MongoDbComponent.class).setMongoConnection(null);
         context.getRegistry().bind("myDb", client);
@@ -41,7 +42,7 @@ public class MongoDbConnectionBeansTest extends AbstractMongoDbTest {
 
     @Test
     public void checkConnectionFromBean() {
-        MongoClient client = container.createClient();
+        MongoClient client = MongoClients.create(service.getReplicaSetUrl());
 
         context.getComponent(SCHEME, MongoDbComponent.class).setMongoConnection(null);
         context.getRegistry().bind("myDb", client);
@@ -53,8 +54,8 @@ public class MongoDbConnectionBeansTest extends AbstractMongoDbTest {
 
     @Test
     public void checkConnectionBothExisting() {
-        MongoClient client1 = container.createClient();
-        MongoClient client2 = container.createClient();
+        MongoClient client1 = MongoClients.create(service.getReplicaSetUrl());
+        MongoClient client2 = MongoClients.create(service.getReplicaSetUrl());
 
         context.getComponent(SCHEME, MongoDbComponent.class).setMongoConnection(null);
         context.getRegistry().bind("myDb", client1);
diff --git a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbContainer.java b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbContainer.java
deleted file mode 100644
index d88a252..0000000
--- a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbContainer.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.mongodb;
-
-import com.mongodb.client.MongoClient;
-import com.mongodb.client.MongoClients;
-import org.bson.Document;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testcontainers.containers.GenericContainer;
-import org.testcontainers.containers.output.Slf4jLogConsumer;
-import org.testcontainers.containers.wait.strategy.Wait;
-
-public class MongoDbContainer extends GenericContainer {
-    private static final Logger LOGGER = LoggerFactory.getLogger(MongoDbContainer.class);
-    private static final String CONTAINER_NAME = "mongo";
-    private static final int MONGODB_PORT = 27017;
-    private static final String MONGO_IMAGE = "mongo:4.4";
-
-    public MongoDbContainer() {
-        super(MONGO_IMAGE);
-
-        setWaitStrategy(Wait.forListeningPort());
-
-        withNetworkAliases(CONTAINER_NAME);
-        withExposedPorts(MONGODB_PORT);
-        withLogConsumer(new Slf4jLogConsumer(LOGGER));
-        withCommand(
-                "--replSet", "replicationName",
-                "--oplogSize", "5000",
-                "--syncdelay", "0",
-                "--noauth");
-    }
-
-    @Override
-    public void start() {
-        super.start();
-
-        Document d = MongoClients.create(getConnectionURI())
-                .getDatabase("admin")
-                .runCommand(new Document("replSetInitiate", new Document()));
-
-        LOGGER.info("replSetInitiate: {}", d);
-        LOGGER.info("waiting to become master");
-
-        try {
-            execInContainer(
-                    "/bin/bash",
-                    "-c",
-                    "until mongo --eval \"printjson(rs.isMaster())\" | grep ismaster | grep true > /dev/null 2>&1; do sleep 1; done");
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-
-        LOGGER.info("started");
-    }
-
-    public String getConnectionAddress() {
-        return getContainerIpAddress() + ":" + getMappedPort(MONGODB_PORT);
-    }
-
-    public String getConnectionURI() {
-        return "mongodb://" + getConnectionAddress();
-    }
-
-    public MongoClient createClient() {
-        return MongoClients.create(getConnectionURI());
-    }
-}
diff --git a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbFindOperationTest.java b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbFindOperationTest.java
index 88cec2d..a76ccae 100644
--- a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbFindOperationTest.java
+++ b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbFindOperationTest.java
@@ -16,18 +16,30 @@
  */
 package org.apache.camel.component.mongodb;
 
+import java.util.Formatter;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
+import com.mongodb.client.MongoCollection;
+import com.mongodb.client.MongoDatabase;
 import com.mongodb.client.model.Projections;
+import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.test.infra.mongodb.services.MongoDBLocalContainerService;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.apache.camel.util.IOHelper;
 import org.apache.commons.lang3.ObjectUtils;
 import org.bson.Document;
 import org.bson.conversions.Bson;
 import org.bson.types.ObjectId;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+import org.testcontainers.containers.wait.strategy.Wait;
 
 import static com.mongodb.client.model.Filters.eq;
 import static org.apache.camel.component.mongodb.MongoDbConstants.MONGO_ID;
@@ -37,7 +49,81 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-public class MongoDbFindOperationTest extends AbstractMongoDbTest {
+public class MongoDbFindOperationTest extends CamelTestSupport {
+
+    @RegisterExtension
+    public static MongoDBLocalContainerService service;
+
+    protected static String dbName = "test";
+    protected static String testCollectionName;
+
+    private static MongoClient mongo;
+    private static MongoDatabase db;
+    private static MongoCollection<Document> testCollection;
+
+    static {
+
+        // This one requires Mongo 4.4. This is related to
+        // "CAMEL-15604 support allowDiskUse for MongoDB find operations"
+        service = new MongoDBLocalContainerService("mongo:4.4");
+
+        service.getContainer()
+                .waitingFor(Wait.forListeningPort())
+                .withCommand(
+                        "--replSet", "replicationName",
+                        "--oplogSize", "5000",
+                        "--syncdelay", "0",
+                        "--noauth");
+    }
+
+    @Override
+    public void doPreSetup() throws Exception {
+        super.doPreSetup();
+
+        mongo = MongoClients.create(service.getReplicaSetUrl());
+        db = mongo.getDatabase(dbName);
+    }
+
+    @Override
+    protected void doPostSetup() {
+        // Refresh the test collection - drop it and recreate it. We don't do
+        // this for the database because MongoDB would create large
+        // store files each time
+        testCollectionName = "camelTest";
+        testCollection = db.getCollection(testCollectionName, Document.class);
+        testCollection.drop();
+        testCollection = db.getCollection(testCollectionName, Document.class);
+    }
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        MongoDbComponent component = new MongoDbComponent();
+        component.setMongoConnection(mongo);
+
+        @SuppressWarnings("deprecation")
+        CamelContext ctx = new DefaultCamelContext();
+        ctx.getPropertiesComponent().setLocation("classpath:mongodb.test.properties");
+
+        ctx.addComponent("mongodb", component);
+
+        return ctx;
+    }
+
+    protected void pumpDataIntoTestCollection() {
+        // there should be 100 of each
+        String[] scientists
+                = { "Einstein", "Darwin", "Copernicus", "Pasteur", "Curie", "Faraday", "Newton", "Bohr", "Galilei", "Maxwell" };
+        for (int i = 1; i <= 1000; i++) {
+            int index = i % scientists.length;
+            Formatter f = new Formatter();
+            String doc
+                    = f.format("{\"_id\":\"%d\", \"scientist\":\"%s\", \"fixedField\": \"fixedValue\"}", i, scientists[index])
+                            .toString();
+            IOHelper.close(f);
+            testCollection.insertOne(Document.parse(doc));
+        }
+        assertEquals(1000L, testCollection.countDocuments(), "Data pumping of 1000 entries did not complete entirely");
+    }
 
     @Test
     public void testFindAllNoCriteriaOperation() throws Exception {
diff --git a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/meta/MongoDbMetaExtensionTest.java b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/meta/MongoDbMetaExtensionTest.java
index 65f5853..bf42a1f 100644
--- a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/meta/MongoDbMetaExtensionTest.java
+++ b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/meta/MongoDbMetaExtensionTest.java
@@ -86,7 +86,7 @@ public class MongoDbMetaExtensionTest extends AbstractMongoDbTest {
         Map<String, Object> parameters = new HashMap<>();
         parameters.put("database", database);
         parameters.put("collection", collection);
-        parameters.put("host", container.getConnectionAddress());
+        parameters.put("host", service.getConnectionAddress());
         parameters.put("user", USER);
         parameters.put("password", PASSWORD);
 
@@ -113,7 +113,7 @@ public class MongoDbMetaExtensionTest extends AbstractMongoDbTest {
         Map<String, Object> parameters = new HashMap<>();
         parameters.put("database", database);
         parameters.put("collection", collection);
-        parameters.put("host", container.getConnectionAddress());
+        parameters.put("host", service.getConnectionAddress());
         parameters.put("user", USER);
         parameters.put("password", PASSWORD);
 
@@ -147,7 +147,7 @@ public class MongoDbMetaExtensionTest extends AbstractMongoDbTest {
         Map<String, Object> parameters = new HashMap<>();
         parameters.put("database", database);
         parameters.put("collection", collection);
-        parameters.put("host", container.getConnectionAddress());
+        parameters.put("host", service.getConnectionAddress());
         parameters.put("user", USER);
         parameters.put("password", PASSWORD);
 
diff --git a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/verifier/MongoDbVerifierExtensionTest.java b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/verifier/MongoDbVerifierExtensionTest.java
index eeb3609..5997fbd 100644
--- a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/verifier/MongoDbVerifierExtensionTest.java
+++ b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/verifier/MongoDbVerifierExtensionTest.java
@@ -52,7 +52,7 @@ public class MongoDbVerifierExtensionTest extends AbstractMongoDbTest {
     public void verifyConnectionOK() {
         //When
         Map<String, Object> parameters = new HashMap<>();
-        parameters.put("host", container.getConnectionAddress());
+        parameters.put("host", service.getConnectionAddress());
         parameters.put("user", USER);
         parameters.put("password", PASSWORD);
         //Given
@@ -81,7 +81,7 @@ public class MongoDbVerifierExtensionTest extends AbstractMongoDbTest {
     public void verifyConnectionMissingParams() {
         //When
         Map<String, Object> parameters = new HashMap<>();
-        parameters.put("host", container.getConnectionAddress());
+        parameters.put("host", service.getConnectionAddress());
         parameters.put("user", USER);
         //Given
         ComponentVerifierExtension.Result result
@@ -95,7 +95,7 @@ public class MongoDbVerifierExtensionTest extends AbstractMongoDbTest {
     public void verifyConnectionNotAuthenticated() {
         //When
         Map<String, Object> parameters = new HashMap<>();
-        parameters.put("host", container.getConnectionAddress());
+        parameters.put("host", service.getConnectionAddress());
         parameters.put("user", USER);
         parameters.put("password", "wrongPassword");
         //Given
@@ -110,7 +110,7 @@ public class MongoDbVerifierExtensionTest extends AbstractMongoDbTest {
     public void verifyConnectionAdminDBKO() {
         //When
         Map<String, Object> parameters = new HashMap<>();
-        parameters.put("host", container.getConnectionAddress());
+        parameters.put("host", service.getConnectionAddress());
         parameters.put("user", USER);
         parameters.put("password", PASSWORD);
         parameters.put("adminDB", "someAdminDB");
diff --git a/parent/pom.xml b/parent/pom.xml
index d0ce9e6..6c35285 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -3519,6 +3519,11 @@
                 <version>${testcontainers-version}</version>
             </dependency>
             <dependency>
+                <groupId>org.testcontainers</groupId>
+                <artifactId>mongodb</artifactId>
+                <version>${testcontainers-version}</version>
+            </dependency>
+            <dependency>
                 <groupId>org.assertj</groupId>
                 <artifactId>assertj-core</artifactId>
                 <version>${assertj-version}</version>
diff --git a/test-infra/camel-test-infra-mongodb/pom.xml b/test-infra/camel-test-infra-mongodb/pom.xml
new file mode 100644
index 0000000..df667a6
--- /dev/null
+++ b/test-infra/camel-test-infra-mongodb/pom.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>camel-test-infra-parent</artifactId>
+        <groupId>org.apache.camel</groupId>
+        <relativePath>../camel-test-infra-parent/pom.xml</relativePath>
+        <version>3.7.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>camel-test-infra-mongodb</artifactId>
+    <name>Camel :: Test Infra :: MongoDB</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-infra-common</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.testcontainers</groupId>
+            <artifactId>testcontainers</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.testcontainers</groupId>
+            <artifactId>mongodb</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+
+</project>
\ No newline at end of file
diff --git a/test-infra/camel-test-infra-mongodb/src/main/resources/META-INF/MANIFEST.MF b/test-infra/camel-test-infra-mongodb/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e69de29
diff --git a/test-infra/camel-test-infra-mongodb/src/test/java/org/apache/camel/test/infra/mongodb/services/MongoDBLocalContainerService.java b/test-infra/camel-test-infra-mongodb/src/test/java/org/apache/camel/test/infra/mongodb/services/MongoDBLocalContainerService.java
new file mode 100644
index 0000000..5ad644a
--- /dev/null
+++ b/test-infra/camel-test-infra-mongodb/src/test/java/org/apache/camel/test/infra/mongodb/services/MongoDBLocalContainerService.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.camel.test.infra.mongodb.services;
+
+import org.apache.camel.test.infra.common.services.ContainerService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testcontainers.containers.MongoDBContainer;
+
+public class MongoDBLocalContainerService implements MongoDBService, ContainerService<MongoDBContainer> {
+    private static final Logger LOG = LoggerFactory.getLogger(MongoDBLocalContainerService.class);
+    private static final int DEFAULT_MONGODB_PORT = 27017;
+    private final MongoDBContainer container;
+
+    public MongoDBLocalContainerService() {
+        this(System.getProperty("mongodb.container"));
+    }
+
+    public MongoDBLocalContainerService(String containerName) {
+        if (containerName == null || containerName.isEmpty()) {
+            container = new MongoDBContainer();
+        } else {
+            container = new MongoDBContainer(containerName);
+        }
+    }
+
+    @Override
+    public String getReplicaSetUrl() {
+        return String.format("mongodb://%s:%s", container.getContainerIpAddress(),
+                container.getMappedPort(DEFAULT_MONGODB_PORT));
+    }
+
+    @Override
+    public String getConnectionAddress() {
+        return container.getContainerIpAddress() + ":" + container.getMappedPort(DEFAULT_MONGODB_PORT);
+    }
+
+    @Override
+    public void initialize() {
+        LOG.info("Trying to start the MongoDB service");
+        container.start();
+        LOG.info("MongoDB service running at {}", container.getReplicaSetUrl());
+    }
+
+    @Override
+    public void shutdown() {
+        LOG.info("Stopping the MongoDB container");
+        container.stop();
+    }
+
+    @Override
+    public MongoDBContainer getContainer() {
+        return container;
+    }
+}
diff --git a/test-infra/camel-test-infra-mongodb/src/test/java/org/apache/camel/test/infra/mongodb/services/MongoDBRemoteService.java b/test-infra/camel-test-infra-mongodb/src/test/java/org/apache/camel/test/infra/mongodb/services/MongoDBRemoteService.java
new file mode 100644
index 0000000..5715228
--- /dev/null
+++ b/test-infra/camel-test-infra-mongodb/src/test/java/org/apache/camel/test/infra/mongodb/services/MongoDBRemoteService.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.camel.test.infra.mongodb.services;
+
+public class MongoDBRemoteService implements MongoDBService {
+
+    public String getReplicaSetUrl() {
+        return System.getProperty("mongodb.url");
+    }
+
+    @Override
+    public String getConnectionAddress() {
+        return System.getProperty("mongodb.connection.address");
+    }
+
+    @Override
+    public void initialize() {
+        // NO-OP
+    }
+
+    @Override
+    public void shutdown() {
+        // NO-OP
+    }
+}
diff --git a/test-infra/camel-test-infra-mongodb/src/test/java/org/apache/camel/test/infra/mongodb/services/MongoDBService.java b/test-infra/camel-test-infra-mongodb/src/test/java/org/apache/camel/test/infra/mongodb/services/MongoDBService.java
new file mode 100644
index 0000000..767b352
--- /dev/null
+++ b/test-infra/camel-test-infra-mongodb/src/test/java/org/apache/camel/test/infra/mongodb/services/MongoDBService.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.camel.test.infra.mongodb.services;
+
+import org.apache.camel.test.infra.common.services.TestService;
+import org.junit.jupiter.api.extension.AfterAllCallback;
+import org.junit.jupiter.api.extension.BeforeAllCallback;
+import org.junit.jupiter.api.extension.ExtensionContext;
+
+public interface MongoDBService extends BeforeAllCallback, AfterAllCallback, TestService {
+
+    /**
+     * The replica set URL in the format mongodb://host:port
+     * 
+     * @return the replica set URL
+     */
+    String getReplicaSetUrl();
+
+    /**
+     * The connection address in the format host:port
+     * 
+     * @return the connection address
+     */
+    String getConnectionAddress();
+
+    @Override
+    default void beforeAll(ExtensionContext extensionContext) throws Exception {
+        initialize();
+    }
+
+    @Override
+    default void afterAll(ExtensionContext extensionContext) throws Exception {
+        shutdown();
+    }
+}
diff --git a/test-infra/camel-test-infra-mongodb/src/test/java/org/apache/camel/test/infra/mongodb/services/MongoDBServiceFactory.java b/test-infra/camel-test-infra-mongodb/src/test/java/org/apache/camel/test/infra/mongodb/services/MongoDBServiceFactory.java
new file mode 100644
index 0000000..552073a
--- /dev/null
+++ b/test-infra/camel-test-infra-mongodb/src/test/java/org/apache/camel/test/infra/mongodb/services/MongoDBServiceFactory.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.camel.test.infra.mongodb.services;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class MongoDBServiceFactory {
+    private static final Logger LOG = LoggerFactory.getLogger(MongoDBServiceFactory.class);
+
+    private MongoDBServiceFactory() {
+
+    }
+
+    public static MongoDBService createService() {
+        String instanceType = System.getProperty("mongodb.instance.type");
+
+        if (instanceType == null || instanceType.equals("local-mongodb-container")) {
+            return new MongoDBLocalContainerService();
+        }
+
+        if (instanceType.equals("remote")) {
+            return new MongoDBRemoteService();
+        }
+
+        LOG.error("MongoDB instance must be one of 'local-mongodb-container' or 'remote");
+        throw new UnsupportedOperationException("Invalid MongoDB instance type");
+    }
+}
diff --git a/test-infra/pom.xml b/test-infra/pom.xml
index 57d737a..002eb03 100644
--- a/test-infra/pom.xml
+++ b/test-infra/pom.xml
@@ -43,5 +43,6 @@
         <module>camel-test-infra-cassandra</module>
         <module>camel-test-infra-elasticsearch</module>
         <module>camel-test-infra-couchbase</module>
+        <module>camel-test-infra-mongodb</module>
     </modules>
 </project>
\ No newline at end of file