You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2020/02/17 13:53:32 UTC

[camel] branch master updated: CAMEL-14569: camel-zookeeper - Use test containers for testing

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

lburgazzoli 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 8c64a52  CAMEL-14569: camel-zookeeper - Use test containers for testing
8c64a52 is described below

commit 8c64a52b93ca409fa54d4f10e9de8e57f82b9920
Author: lburgazzoli <lb...@gmail.com>
AuthorDate: Mon Feb 17 13:03:34 2020 +0100

    CAMEL-14569: camel-zookeeper - Use test containers for testing
---
 components/camel-zookeeper/pom.xml                 |  92 +++++++--
 .../component/zookeeper/ConsumeChildrenTest.java   |   2 +-
 .../camel/component/zookeeper/ConsumeDataTest.java |   4 +-
 .../component/zookeeper/ZooKeeperContainer.java    |  94 +++++++++
 .../zookeeper/ZooKeeperManagedEndpointTest.java    |  38 +---
 .../component/zookeeper/ZooKeeperProducerTest.java |  64 +++---
 .../component/zookeeper/ZooKeeperTestSupport.java  | 219 ++-------------------
 .../zookeeper/ZookeeperConnectionManagerTest.java  |   2 +-
 .../cloud/SpringZooKeeperServiceCallRouteTest.java |  48 +++--
 .../cloud/ZooKeeperServiceCallRouteTest.java       |  18 +-
 .../cloud/ZooKeeperServiceDiscoveryTest.java       |  15 +-
 .../ZooKeeperServiceRegistrationTestBase.java      |  17 +-
 .../ZooKeeperClusteredRoutePolicyFactoryMain.java  |   2 +-
 .../ZooKeeperClusteredRoutePolicyFactoryTest.java  |  22 +--
 .../cluster/ZooKeeperClusteredRoutePolicyTest.java |  22 +--
 .../zookeeper/cluster/ZooKeeperMasterMain.java     |   2 +-
 .../zookeeper/cluster/ZooKeeperMasterTest.java     |  22 +--
 .../src/test/resources/log4j2.properties           |   2 +-
 .../cloud/SpringZooKeeperServiceCallRouteTest.xml  |   2 +-
 ...ingZooKeeperClusteredRouteConfigurationTest.xml |  13 +-
 20 files changed, 344 insertions(+), 356 deletions(-)

diff --git a/components/camel-zookeeper/pom.xml b/components/camel-zookeeper/pom.xml
index d52c3af..64c43ba 100644
--- a/components/camel-zookeeper/pom.xml
+++ b/components/camel-zookeeper/pom.xml
@@ -136,7 +136,7 @@
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
-            <artifactId>camel-test-spring</artifactId>
+            <artifactId>camel-testcontainers-spring</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -157,20 +157,82 @@
 
     </dependencies>
 
-    <build>
-        <plugins>
-            <plugin>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <configuration>
-                    <childDelegation>false</childDelegation>
-                    <useFile>true</useFile>
-                    <forkCount>1</forkCount>
-                    <reuseForks>true</reuseForks>
-                    <forkedProcessTimeoutInSeconds>600</forkedProcessTimeoutInSeconds>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
+
+    <profiles>
+        <profile>
+            <id>zookeeper-skip-tests</id>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <configuration>
+                            <skipTests>true</skipTests>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+
+        <!-- activate test if the docker socket file is accessible -->
+        <profile>
+            <id>zookeeper-tests-docker-file</id>
+            <activation>
+                <file>
+                    <exists>/var/run/docker.sock</exists>
+                </file>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <configuration>
+                            <skipTests>${skipTests}</skipTests>
+                            <systemPropertyVariables>
+                                <visibleassertions.silence>true</visibleassertions.silence>
+                            </systemPropertyVariables>
+                            <childDelegation>false</childDelegation>
+                            <useFile>true</useFile>
+                            <forkCount>1</forkCount>
+                            <reuseForks>true</reuseForks>
+                            <forkedProcessTimeoutInSeconds>600</forkedProcessTimeoutInSeconds>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+
+        <!-- activate test if the DOCKER_HOST env var is set -->
+        <profile>
+            <id>zookeeper-tests-docker-env</id>
+            <activation>
+                <property>
+                    <name>env.DOCKER_HOST</name>
+                </property>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <configuration>
+                            <skipTests>${skipTests}</skipTests>
+                            <systemPropertyVariables>
+                                <visibleassertions.silence>true</visibleassertions.silence>
+                            </systemPropertyVariables>
+                            <childDelegation>false</childDelegation>
+                            <useFile>true</useFile>
+                            <forkCount>1</forkCount>
+                            <reuseForks>true</reuseForks>
+                            <forkedProcessTimeoutInSeconds>600</forkedProcessTimeoutInSeconds>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+
+    </profiles>
 
 
 </project>
diff --git a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ConsumeChildrenTest.java b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ConsumeChildrenTest.java
index 26ba9cc..95c3cef 100644
--- a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ConsumeChildrenTest.java
+++ b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ConsumeChildrenTest.java
@@ -36,7 +36,7 @@ public class ConsumeChildrenTest extends ZooKeeperTestSupport {
     protected RouteBuilder[] createRouteBuilders() throws Exception {
         return new RouteBuilder[] {new RouteBuilder() {
             public void configure() throws Exception {
-                from("zookeeper://localhost:" + getServerPort() + "/grimm?repeat=true&listChildren=true")
+                from("zookeeper://{{container:host:zookeeper}}:{{container:port:2181@zookeeper}}/grimm?repeat=true&listChildren=true")
                     .sort(body(), new NaturalSortComparator(Order.Descending))
                     .to("mock:zookeeper-data");
             }
diff --git a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ConsumeDataTest.java b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ConsumeDataTest.java
index 727c47a..f6afc16 100644
--- a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ConsumeDataTest.java
+++ b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ConsumeDataTest.java
@@ -30,7 +30,7 @@ public class ConsumeDataTest extends ZooKeeperTestSupport {
     protected RouteBuilder[] createRouteBuilders() throws Exception {
         return new RouteBuilder[] {new RouteBuilder() {
             public void configure() throws Exception {
-                from("zookeeper://localhost:" + getServerPort() + "/camel?repeat=true").to("mock:zookeeper-data");
+                from("zookeeper://{{container:host:zookeeper}}:{{container:port:2181@zookeeper}}/camel?repeat=true").to("mock:zookeeper-data");
             }
         }};
     }
@@ -89,7 +89,7 @@ public class ConsumeDataTest extends ZooKeeperTestSupport {
         // recreate and update a number of times.
         createCamelNode();
         updateNode(10);
-  
+
         MockEndpoint.assertIsSatisfied(30, TimeUnit.SECONDS);
 
         client.delete("/camel");
diff --git a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ZooKeeperContainer.java b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ZooKeeperContainer.java
new file mode 100644
index 0000000..7b18ab6
--- /dev/null
+++ b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ZooKeeperContainer.java
@@ -0,0 +1,94 @@
+/*
+ * 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.zookeeper;
+
+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 ZooKeeperContainer extends GenericContainer {
+    public static final String CONTAINER_IMAGE = "zookeeper:3.5";
+    public static final String CONTAINER_NAME = "zookeeper";
+    public static final int CLIENT_PORT = 2181;
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ZooKeeperContainer.class);
+
+    public ZooKeeperContainer() {
+        this(CONTAINER_NAME, -1);
+    }
+
+    public ZooKeeperContainer(int clientPort) {
+        this(CONTAINER_NAME, clientPort);
+    }
+
+    public ZooKeeperContainer(String name) {
+        this(name, -1);
+
+        setWaitStrategy(Wait.forListeningPort());
+
+        withNetworkAliases(name);
+        withExposedPorts(CLIENT_PORT);
+        withLogConsumer(new Slf4jLogConsumer(LOGGER));
+    }
+
+    public ZooKeeperContainer(String name, int clientPort) {
+        super(CONTAINER_IMAGE);
+
+        setWaitStrategy(Wait.forListeningPort());
+
+        withNetworkAliases(name);
+        withLogConsumer(new Slf4jLogConsumer(LOGGER));
+
+        if (clientPort > 0) {
+            addFixedExposedPort(clientPort, CLIENT_PORT);
+        } else {
+            withExposedPorts(CLIENT_PORT);
+        }
+    }
+
+    @Override
+    public void start() {
+        LOGGER.info("****************************************");
+        LOGGER.info("* Starting ZooKeeper container         *");
+        LOGGER.info("****************************************");
+
+        super.start();
+
+        LOGGER.info("****************************************");
+        LOGGER.info("* ZooKeeper container started          *");
+        LOGGER.info("****************************************");
+    }
+
+    @Override
+    public void stop() {
+        LOGGER.info("****************************************");
+        LOGGER.info("* Stopping ZooKeeper container         *");
+        LOGGER.info("****************************************");
+
+        super.stop();
+
+        LOGGER.info("****************************************");
+        LOGGER.info("* ZooKeeper container stopped          *");
+        LOGGER.info("****************************************");
+    }
+
+    public String getConnectionString() {
+        return getContainerIpAddress() + ":" + getMappedPort(CLIENT_PORT);
+    }
+}
diff --git a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ZooKeeperManagedEndpointTest.java b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ZooKeeperManagedEndpointTest.java
index ed0482e..2d775f5 100644
--- a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ZooKeeperManagedEndpointTest.java
+++ b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ZooKeeperManagedEndpointTest.java
@@ -22,42 +22,17 @@ import java.util.Set;
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
-import org.apache.camel.CamelContext;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.impl.DefaultCamelContext;
-import org.apache.camel.test.junit4.CamelTestSupport;
-import org.junit.After;
-import org.junit.Before;
 import org.junit.Test;
 import org.springframework.jmx.support.JmxUtils;
 
 @SuppressWarnings("all")
-public class ZooKeeperManagedEndpointTest extends CamelTestSupport {
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        ZooKeeperTestSupport.setupTestServer();
-        super.setUp();
-    }
-
-    @Override
-    @After
-    public void tearDown() throws Exception {
-        super.tearDown();
-        ZooKeeperTestSupport.shutdownServer();
-    }
-
+public class ZooKeeperManagedEndpointTest extends ZooKeeperTestSupport {
     @Override
     protected boolean useJmx() {
         return true;
     }
 
-    protected CamelContext createCamelContext() throws Exception {
-        CamelContext context = new DefaultCamelContext();
-        return context;
-    }
-
     protected MBeanServer getMBeanServer() {
         return context.getManagementStrategy().getManagementAgent().getMBeanServer();
     }
@@ -75,9 +50,12 @@ public class ZooKeeperManagedEndpointTest extends CamelTestSupport {
         verifyManagedAttribute(zepName, "Timeout", 1000);
         verifyManagedAttribute(zepName, "Backoff", 2000L);
 
-        getMBeanServer().invoke(zepName, "clearServers", null, JmxUtils.getMethodSignature(ZooKeeperEndpoint.class.getMethod("clearServers", null)));
-        getMBeanServer().invoke(zepName, "addServer", new Object[]{"someserver:12345"},
-                JmxUtils.getMethodSignature(ZooKeeperEndpoint.class.getMethod("addServer", new Class[]{String.class})));
+        getMBeanServer().invoke(zepName, "clearServers",
+            null,
+            JmxUtils.getMethodSignature(ZooKeeperEndpoint.class.getMethod("clearServers", null)));
+        getMBeanServer().invoke(zepName, "addServer",
+            new Object[]{"someserver:12345"},
+            JmxUtils.getMethodSignature(ZooKeeperEndpoint.class.getMethod("addServer", new Class[]{String.class})));
     }
 
     private void verifyManagedAttribute(ObjectName zepName, String attributeName, String attributeValue) throws Exception {
@@ -99,7 +77,7 @@ public class ZooKeeperManagedEndpointTest extends CamelTestSupport {
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             public void configure() {
-                from("zookeeper://localhost:" + ZooKeeperTestSupport.getServerPort() + "/node?timeout=1000&backoff=2000").to("mock:test");
+                from("zookeeper://{{container:host:zookeeper}}:{{container:port:2181@zookeeper}}/node?timeout=1000&backoff=2000").to("mock:test");
             }
         };
     }
diff --git a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ZooKeeperProducerTest.java b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ZooKeeperProducerTest.java
index 44f6a2f..86181e2 100644
--- a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ZooKeeperProducerTest.java
+++ b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ZooKeeperProducerTest.java
@@ -39,30 +39,46 @@ public class ZooKeeperProducerTest extends ZooKeeperTestSupport {
 
     @Override
     protected RouteBuilder[] createRouteBuilders() throws Exception {
-        return new RouteBuilder[] {new RouteBuilder() {
-            public void configure() throws Exception {
-                zookeeperUri = "zookeeper://localhost:" + getServerPort() + "/node?create=true";
-                from("direct:roundtrip").to(zookeeperUri).to("mock:producer-out");
-                from(zookeeperUri).to("mock:consumed-from-node");
+        return new RouteBuilder[] {
+            new RouteBuilder() {
+                public void configure() throws Exception {
+                    zookeeperUri = "zookeeper://{{container:host:zookeeper}}:{{container:port:2181@zookeeper}}/node?create=true";
+                    from("direct:roundtrip")
+                        .to(zookeeperUri)
+                        .to("mock:producer-out");
+                    from(zookeeperUri)
+                        .to("mock:consumed-from-node");
+                }
+            },
+            new RouteBuilder() {
+                public void configure() throws Exception {
+                    from("direct:no-create-fails-set")
+                        .to("zookeeper://{{container:host:zookeeper}}:{{container:port:2181@zookeeper}}/doesnotexist");
+                }
+            },
+            new RouteBuilder() {
+                public void configure() throws Exception {
+                    from("direct:node-from-header")
+                        .to("zookeeper://{{container:host:zookeeper}}:{{container:port:2181@zookeeper}}/notset?create=true");
+                    from("zookeeper://{{container:host:zookeeper}}:{{container:port:2181@zookeeper}}/set?create=true")
+                        .to("mock:consumed-from-set-node");
+                }
+            },
+            new RouteBuilder() {
+                public void configure() throws Exception {
+                    from("direct:create-mode")
+                        .to("zookeeper://{{container:host:zookeeper}}:{{container:port:2181@zookeeper}}/persistent?create=true&createMode=PERSISTENT")
+                        .to("mock:create-mode");
+                }
+            },
+            new RouteBuilder() {
+                public void configure() throws Exception {
+                    from("direct:delete")
+                        .to("zookeeper://{{container:host:zookeeper}}:{{container:port:2181@zookeeper}}/to-be-deleted")
+                        .to("mock:delete");
+                }
             }
-        }, new RouteBuilder() {
-            public void configure() throws Exception {
-                from("direct:no-create-fails-set").to("zookeeper://localhost:" + getServerPort() + "/doesnotexist");
-            }
-        }, new RouteBuilder() {
-            public void configure() throws Exception {
-                from("direct:node-from-header").to("zookeeper://localhost:" + getServerPort() + "/notset?create=true");
-                from("zookeeper://localhost:" + getServerPort() + "/set?create=true").to("mock:consumed-from-set-node");
-            }
-        }, new RouteBuilder() {
-            public void configure() throws Exception {
-                from("direct:create-mode").to("zookeeper://localhost:" + getServerPort() + "/persistent?create=true&createMode=PERSISTENT").to("mock:create-mode");
-            }
-        }, new RouteBuilder() {
-            public void configure() throws Exception {
-                from("direct:delete").to("zookeeper://localhost:39913/to-be-deleted").to("mock:delete");
-            }
-        }};
+        };
     }
 
     @Test
@@ -143,7 +159,7 @@ public class ZooKeeperProducerTest extends ZooKeeperTestSupport {
         Exchange exchange = createExchangeWithBody(testPayload);
         exchange.getIn().setHeader(ZOOKEEPER_NODE, "/set-listing/firstborn");
         exchange.setPattern(ExchangePattern.InOut);
-        template.send("zookeeper://localhost:" + getServerPort() + "/set-listing?create=true&listChildren=true", exchange);
+        template.send("zookeeper://{{container:host:zookeeper}}:{{container:port:2181@zookeeper}}/set-listing?create=true&listChildren=true", exchange);
         List<?> children = exchange.getMessage().getMandatoryBody(List.class);
         assertEquals(1, children.size());
         assertEquals("firstborn", children.get(0));
diff --git a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ZooKeeperTestSupport.java b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ZooKeeperTestSupport.java
index cbc2bb2..7e620d7 100644
--- a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ZooKeeperTestSupport.java
+++ b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ZooKeeperTestSupport.java
@@ -16,26 +16,14 @@
  */
 package org.apache.camel.component.zookeeper;
 
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.net.InetSocketAddress;
-import java.net.Socket;
 import java.util.Arrays;
-import java.util.Deque;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.test.AvailablePortFinder;
-import org.apache.camel.test.junit4.CamelTestSupport;
-import org.apache.camel.util.FileUtil;
-import org.apache.camel.util.IOHelper;
+import org.apache.camel.test.testcontainers.ContainerAwareTestSupport;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.WatchedEvent;
 import org.apache.zookeeper.Watcher;
@@ -44,112 +32,50 @@ import org.apache.zookeeper.ZooDefs.Ids;
 import org.apache.zookeeper.ZooKeeper;
 import org.apache.zookeeper.data.ACL;
 import org.apache.zookeeper.data.Stat;
-import org.apache.zookeeper.server.NIOServerCnxnFactory;
-import org.apache.zookeeper.server.ZooKeeperServer;
-import org.apache.zookeeper.server.persistence.FileTxnSnapLog;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.testcontainers.containers.GenericContainer;
 
-public class ZooKeeperTestSupport extends CamelTestSupport {
-
-    protected static TestZookeeperServer server;
-    protected static TestZookeeperClient client;
-
-    private static volatile int port;
-    private static final Logger LOG = LoggerFactory.getLogger(ZooKeeperTestSupport.class);
- 
+public class ZooKeeperTestSupport extends ContainerAwareTestSupport {
     protected String testPayload = "This is a test";
     protected byte[] testPayloadBytes = testPayload.getBytes();
-        
-    @BeforeClass
-    public static void setupTestServer() throws Exception {
-        port = AvailablePortFinder.getNextAvailable();
-        
-        LOG.info("Starting Zookeeper Test Infrastructure");
-        server = new TestZookeeperServer(getServerPort(), clearServerData());
-        waitForServerUp("localhost:" + getServerPort(), 1000);
-        client = new TestZookeeperClient(getServerPort(), getTestClientSessionTimeout());
-        LOG.info("Started Zookeeper Test Infrastructure on port " + getServerPort());
+    protected TestZookeeperClient client;
+
+    @Override
+    protected GenericContainer<?> createContainer() {
+        return new ZooKeeperContainer();
     }
 
-    public ZooKeeper getConnection() {
-        return client.getConnection();
+    @Override
+    public void doPreSetup() throws Exception {
+        client = new TestZookeeperClient(getConnectionString(), getTestClientSessionTimeout());
     }
 
-    @AfterClass
-    public static void shutdownServer() throws Exception {
-        LOG.info("Stopping Zookeeper Test Infrastructure");
+    @Override
+    protected void doPostTearDown() throws Exception {
         client.shutdown();
-        server.shutdown();
-        waitForServerDown("localhost:" + getServerPort(), 1000);
-        LOG.info("Stopped Zookeeper Test Infrastructure");
     }
 
-    protected static int getServerPort() {
-        return port;
+    public String getConnectionString() {
+        return getContainerHost(ZooKeeperContainer.CONTAINER_NAME) + ":" + getContainerPort(ZooKeeperContainer.CONTAINER_NAME, ZooKeeperContainer.CLIENT_PORT);
     }
 
-    protected static int getTestClientSessionTimeout() {
-        return 100000;
-    }
-
-    protected static boolean clearServerData() {
-        return true;
+    public ZooKeeper getConnection() {
+        return client.getConnection();
     }
 
-    public static class TestZookeeperServer {
-        private static int count;
-        private NIOServerCnxnFactory connectionFactory;
-        private ZooKeeperServer zkServer;
-        private File zookeeperBaseDir;
-        
-        public TestZookeeperServer(int clientPort, boolean clearServerData) throws Exception {
-            // TODO This is necessary as zookeeper does not delete the log dir when it shuts down. Remove as soon as zookeeper shutdown works
-            zookeeperBaseDir = new File("./target/zookeeper" + count++);
-            if (clearServerData) {
-                cleanZookeeperDir();
-            }
-            zkServer = new ZooKeeperServer();
-            File dataDir = new File(zookeeperBaseDir, "log");
-            File snapDir = new File(zookeeperBaseDir, "data");
-            FileTxnSnapLog ftxn = new FileTxnSnapLog(dataDir, snapDir);
-            zkServer.setTxnLogFactory(ftxn);
-            zkServer.setTickTime(1000);
-            connectionFactory = new NIOServerCnxnFactory();
-            connectionFactory.configure(new InetSocketAddress("localhost", clientPort), 0);
-            connectionFactory.startup(zkServer);
-        }
-        
-        private void cleanZookeeperDir() throws Exception {
-            File working = zookeeperBaseDir;
-            deleteDir(working);
-        }
-
-        public void shutdown() throws Exception {
-            connectionFactory.shutdown();
-            connectionFactory.join();
-            zkServer.shutdown();
-            while (zkServer.isRunning()) {
-                zkServer.shutdown();
-                Thread.sleep(100);
-            }
-            cleanZookeeperDir();
-        }
+    protected static int getTestClientSessionTimeout() {
+        return 100000;
     }
 
     public static class TestZookeeperClient implements Watcher {
-
-        public static int x;
-
         private final Logger log = LoggerFactory.getLogger(getClass());
         private ZooKeeper zk;
         private CountDownLatch connected = new CountDownLatch(1);
 
 
-        public TestZookeeperClient(int port, int timeout) throws Exception {
-            zk = new ZooKeeper("localhost:" + port, timeout, this);
+        public TestZookeeperClient(String connectString, int timeout) throws Exception {
+            zk = new ZooKeeper(connectString, timeout, this);
             connected.await();
         }
 
@@ -221,109 +147,6 @@ public class ZooKeeperTestSupport extends CamelTestSupport {
         }
     }
 
-    // Wait methods are taken directly from the Zookeeper tests. A tests jar
-    // would be nice! Another good reason the keeper folks should move to maven.
-    public static boolean waitForServerUp(String hp, long timeout) {
-        long start = System.currentTimeMillis();
-        while (true) {
-            try {
-                // if there are multiple hostports, just take the first one
-                hp = hp.split(",")[0];
-                String result = send4LetterWord(hp, "stat");
-                if (result.startsWith("Zookeeper version:")) {
-                    return true;
-                }
-            } catch (IOException e) {
-                LOG.info("server {} not up {}", hp, e);
-            }
-
-            if (System.currentTimeMillis() > start + timeout) {
-                break;
-            }
-            try {
-                Thread.sleep(250);
-            } catch (InterruptedException e) {
-                // ignore
-            }
-        }
-        return false;
-    }
-
-    private static String send4LetterWord(String hp, String cmd) throws IOException {
-        String split[] = hp.split(":");
-        String host = split[0];
-        int port;
-        try {
-            port = Integer.parseInt(split[1]);
-        } catch (RuntimeException e) {
-            throw new RuntimeException("Problem parsing " + hp + e.toString());
-        }
-
-        Socket sock = new Socket(host, port);
-        BufferedReader reader = null;
-        try {
-            OutputStream outstream = sock.getOutputStream();
-            outstream.write(cmd.getBytes());
-            outstream.flush();
-
-            reader = IOHelper.buffered(new InputStreamReader(sock.getInputStream()));
-            StringBuilder sb = new StringBuilder();
-            String line;
-            while ((line = reader.readLine()) != null) {
-                sb.append(line + "\n");
-            }
-            return sb.toString();
-        } finally {
-            sock.close();
-            if (reader != null) {
-                reader.close();
-            }
-        }
-    }
-
-    private static boolean waitForServerDown(String hp, long timeout) {
-        long start = System.currentTimeMillis();
-        while (true) {
-            try {
-                send4LetterWord(hp, "stat");
-            } catch (IOException e) {
-                return true;
-            }
-
-            if (System.currentTimeMillis() > start + timeout) {
-                break;
-            }
-            try {
-                Thread.sleep(250);
-            } catch (InterruptedException e) {
-                // ignore
-            }
-        }
-        return false;
-    }
-
-    public static void deleteDir(File f) {
-        LinkedList<File> deleteStack = new LinkedList<>();
-        deleteStack.addLast(f);
-        deleteDir(deleteStack);
-    }
-
-    private static void deleteDir(Deque<File> deleteStack) {
-        File f = deleteStack.pollLast();
-        if (f != null) {
-            if (f.isDirectory()) {
-                File[] files = f.listFiles();
-                if (files != null) {
-                    for (File child : files) {
-                        deleteStack.addLast(child);
-                    }
-                }
-            }
-            deleteDir(deleteStack);
-            FileUtil.deleteFile(f);
-        }
-    }
-
     public static void delay(int wait) throws InterruptedException {
         Thread.sleep(wait);
     }
diff --git a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ZookeeperConnectionManagerTest.java b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ZookeeperConnectionManagerTest.java
index 8815fa9..bee0fd6 100644
--- a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ZookeeperConnectionManagerTest.java
+++ b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/ZookeeperConnectionManagerTest.java
@@ -25,7 +25,7 @@ public class ZookeeperConnectionManagerTest extends ZooKeeperTestSupport {
     @Test
     public void shouldWaitForConnection() {
         ZooKeeperConfiguration config = new ZooKeeperConfiguration();
-        config.addZookeeperServer("localhost:" + getServerPort());
+        config.addZookeeperServer(getConnectionString());
 
         ZooKeeperComponent component = new ZooKeeperComponent(config);
         component.setConfiguration(config);
diff --git a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cloud/SpringZooKeeperServiceCallRouteTest.java b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cloud/SpringZooKeeperServiceCallRouteTest.java
index 38cc21a..54795c0 100644
--- a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cloud/SpringZooKeeperServiceCallRouteTest.java
+++ b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cloud/SpringZooKeeperServiceCallRouteTest.java
@@ -16,8 +16,11 @@
  */
 package org.apache.camel.component.zookeeper.cloud;
 
-import org.apache.camel.component.zookeeper.ZooKeeperTestSupport;
-import org.apache.camel.test.spring.CamelSpringTestSupport;
+import java.util.Collections;
+
+import org.apache.camel.component.zookeeper.ZooKeeperContainer;
+import org.apache.camel.test.testcontainers.ContainerPropertiesFunction;
+import org.apache.camel.test.testcontainers.spring.ContainerAwareSpringTestSupport;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.retry.ExponentialBackoffRetry;
@@ -26,17 +29,17 @@ import org.apache.curator.x.discovery.ServiceDiscovery;
 import org.apache.curator.x.discovery.ServiceDiscoveryBuilder;
 import org.apache.curator.x.discovery.ServiceInstance;
 import org.apache.curator.x.discovery.details.JsonInstanceSerializer;
-import org.junit.After;
 import org.junit.Test;
+import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
 import org.springframework.context.support.AbstractApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.context.support.GenericApplicationContext;
+import org.springframework.core.io.ClassPathResource;
+import org.testcontainers.containers.GenericContainer;
 
-public class SpringZooKeeperServiceCallRouteTest extends CamelSpringTestSupport {
-    private static final int SERVER_PORT = 9001;
+public class SpringZooKeeperServiceCallRouteTest extends ContainerAwareSpringTestSupport {
     private static final String SERVICE_NAME = "http-service";
     private static final String SERVICE_PATH = "/camel";
 
-    private ZooKeeperTestSupport.TestZookeeperServer server;
     private CuratorFramework curator;
     private ServiceDiscovery<ZooKeeperServiceDiscovery.MetaData> discovery;
 
@@ -45,14 +48,16 @@ public class SpringZooKeeperServiceCallRouteTest extends CamelSpringTestSupport
     // ***********************
 
     @Override
+    public GenericContainer createContainer() {
+        return new ZooKeeperContainer();
+    }
+
+    @Override
     public void doPreSetup() throws Exception {
         super.doPreSetup();
 
-        server = new ZooKeeperTestSupport.TestZookeeperServer(SERVER_PORT, true);
-        ZooKeeperTestSupport.waitForServerUp("127.0.0.1:" + SERVER_PORT, 1000);
-
         curator = CuratorFrameworkFactory.builder()
-            .connectString("127.0.0.1:" + SERVER_PORT)
+            .connectString(getContainerHost(ZooKeeperContainer.CONTAINER_NAME) + ":" + getContainerPort(ZooKeeperContainer.CONTAINER_NAME, ZooKeeperContainer.CLIENT_PORT))
             .retryPolicy(new ExponentialBackoffRetry(1000, 3))
             .build();
 
@@ -91,16 +96,11 @@ public class SpringZooKeeperServiceCallRouteTest extends CamelSpringTestSupport
     }
 
     @Override
-    @After
-    public void tearDown() throws Exception {
-        super.tearDown();
+    public void doPostTearDown() throws Exception {
+        super.doPostTearDown();
 
         CloseableUtils.closeQuietly(discovery);
         CloseableUtils.closeQuietly(curator);
-
-        if (server != null) {
-            server.shutdown();
-        }
     }
 
     // ***********************
@@ -125,6 +125,16 @@ public class SpringZooKeeperServiceCallRouteTest extends CamelSpringTestSupport
 
     @Override
     protected AbstractApplicationContext createApplicationContext() {
-        return new ClassPathXmlApplicationContext("org/apache/camel/component/zookeeper/cloud/SpringZooKeeperServiceCallRouteTest.xml");
+        GenericApplicationContext applicationContext = new GenericApplicationContext();
+        applicationContext.getBeanFactory().registerSingleton(
+            "zkProperties",
+            new ContainerPropertiesFunction(Collections.singletonList(getContainer(ZooKeeperContainer.CONTAINER_NAME))));
+
+        XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(applicationContext);
+        xmlReader.loadBeanDefinitions(new ClassPathResource("org/apache/camel/component/zookeeper/cloud/SpringZooKeeperServiceCallRouteTest.xml"));
+
+        applicationContext.refresh();
+
+        return applicationContext;
     }
 }
diff --git a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cloud/ZooKeeperServiceCallRouteTest.java b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cloud/ZooKeeperServiceCallRouteTest.java
index b990a7b..671e364 100644
--- a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cloud/ZooKeeperServiceCallRouteTest.java
+++ b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cloud/ZooKeeperServiceCallRouteTest.java
@@ -21,7 +21,7 @@ import java.util.List;
 
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.zookeeper.ZooKeeperTestSupport;
+import org.apache.camel.component.zookeeper.ZooKeeperContainer;
 import org.apache.camel.test.AvailablePortFinder;
 import org.apache.camel.test.junit4.CamelTestSupport;
 import org.apache.curator.framework.CuratorFramework;
@@ -32,7 +32,6 @@ import org.apache.curator.x.discovery.ServiceDiscovery;
 import org.apache.curator.x.discovery.ServiceDiscoveryBuilder;
 import org.apache.curator.x.discovery.ServiceInstance;
 import org.apache.curator.x.discovery.details.JsonInstanceSerializer;
-import org.junit.After;
 import org.junit.Test;
 
 public class ZooKeeperServiceCallRouteTest extends CamelTestSupport {
@@ -41,7 +40,7 @@ public class ZooKeeperServiceCallRouteTest extends CamelTestSupport {
     private static final int SERVICE_COUNT = 5;
     private static final String SERVICE_PATH = "/camel";
 
-    private ZooKeeperTestSupport.TestZookeeperServer server;
+    protected ZooKeeperContainer container;
     private CuratorFramework curator;
     private ServiceDiscovery<ZooKeeperServiceDiscovery.MetaData> discovery;
     private List<ServiceInstance<ZooKeeperServiceDiscovery.MetaData>> instances;
@@ -55,11 +54,11 @@ public class ZooKeeperServiceCallRouteTest extends CamelTestSupport {
     protected void doPreSetup() throws Exception {
         super.doPreSetup();
 
-        server = new ZooKeeperTestSupport.TestZookeeperServer(SERVER_PORT, true);
-        ZooKeeperTestSupport.waitForServerUp("127.0.0.1:" + SERVER_PORT, 1000);
+        container = new ZooKeeperContainer();
+        container.start();
 
         curator = CuratorFrameworkFactory.builder()
-            .connectString("127.0.0.1:" + SERVER_PORT)
+            .connectString(container.getConnectionString())
             .retryPolicy(new ExponentialBackoffRetry(1000, 3))
             .build();
 
@@ -90,7 +89,6 @@ public class ZooKeeperServiceCallRouteTest extends CamelTestSupport {
     }
 
     @Override
-    @After
     public void tearDown() throws Exception {
         super.tearDown();
 
@@ -105,7 +103,9 @@ public class ZooKeeperServiceCallRouteTest extends CamelTestSupport {
         CloseableUtils.closeQuietly(discovery);
         CloseableUtils.closeQuietly(curator);
 
-        server.shutdown();
+        if (container != null) {
+            container.stop();
+        }
     }
 
     // *************************************************************************
@@ -136,7 +136,7 @@ public class ZooKeeperServiceCallRouteTest extends CamelTestSupport {
                         .name(SERVICE_NAME)
                         .component("http")
                         .defaultLoadBalancer()
-                        .zookeeperServiceDiscovery("127.0.0.1:" + SERVER_PORT, SERVICE_PATH)
+                        .zookeeperServiceDiscovery(container.getConnectionString(), SERVICE_PATH)
                         .end()
                     .to("log:org.apache.camel.component.zookeeper.cloud?level=INFO&showAll=true&multiline=true")
                     .to("mock:result");
diff --git a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cloud/ZooKeeperServiceDiscoveryTest.java b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cloud/ZooKeeperServiceDiscoveryTest.java
index f615620..a61b92c 100644
--- a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cloud/ZooKeeperServiceDiscoveryTest.java
+++ b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cloud/ZooKeeperServiceDiscoveryTest.java
@@ -20,9 +20,9 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.camel.cloud.ServiceDefinition;
+import org.apache.camel.component.zookeeper.ZooKeeperContainer;
 import org.apache.camel.component.zookeeper.ZooKeeperCuratorConfiguration;
 import org.apache.camel.component.zookeeper.ZooKeeperCuratorHelper;
-import org.apache.camel.component.zookeeper.ZooKeeperTestSupport;
 import org.apache.camel.test.AvailablePortFinder;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.retry.ExponentialBackoffRetry;
@@ -41,16 +41,15 @@ public class ZooKeeperServiceDiscoveryTest {
     public void testServiceDiscovery() throws Exception {
         ZooKeeperCuratorConfiguration configuration  = new ZooKeeperCuratorConfiguration();
         ServiceDiscovery<ZooKeeperServiceDiscovery.MetaData> zkDiscovery = null;
-        ZooKeeperTestSupport.TestZookeeperServer server = null;
-        int port = AvailablePortFinder.getNextAvailable();
+        ZooKeeperContainer container = null;
 
         try {
-            server = new ZooKeeperTestSupport.TestZookeeperServer(port, true);
-            ZooKeeperTestSupport.waitForServerUp("localhost:" + port, 1000);
+            container = new ZooKeeperContainer();
+            container.start();
 
             configuration.setBasePath("/camel");
             configuration.setCuratorFramework(CuratorFrameworkFactory.builder()
-                .connectString("localhost:" + port)
+                .connectString(container.getConnectionString())
                 .retryPolicy(new ExponentialBackoffRetry(1000, 3))
                 .build()
             );
@@ -103,8 +102,8 @@ public class ZooKeeperServiceDiscoveryTest {
             CloseableUtils.closeQuietly(zkDiscovery);
             CloseableUtils.closeQuietly(configuration.getCuratorFramework());
 
-            if (server != null) {
-                server.shutdown();
+            if (container != null) {
+                container.stop();
             }
         }
     }
diff --git a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cloud/ZooKeeperServiceRegistrationTestBase.java b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cloud/ZooKeeperServiceRegistrationTestBase.java
index d9fd966..2dd5851 100644
--- a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cloud/ZooKeeperServiceRegistrationTestBase.java
+++ b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cloud/ZooKeeperServiceRegistrationTestBase.java
@@ -23,7 +23,7 @@ import java.util.UUID;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.cloud.ServiceDefinition;
-import org.apache.camel.component.zookeeper.ZooKeeperTestSupport;
+import org.apache.camel.component.zookeeper.ZooKeeperContainer;
 import org.apache.camel.test.AvailablePortFinder;
 import org.apache.camel.test.junit4.CamelTestSupport;
 import org.apache.curator.framework.CuratorFramework;
@@ -43,9 +43,8 @@ public abstract class ZooKeeperServiceRegistrationTestBase extends CamelTestSupp
     protected static final String SERVICE_HOST = "localhost";
     protected static final String SERVICE_PATH = "/camel";
     protected static final int SERVICE_PORT = AvailablePortFinder.getNextAvailable();
-    protected static final int SERVER_PORT = AvailablePortFinder.getNextAvailable();
 
-    protected ZooKeeperTestSupport.TestZookeeperServer server;
+    protected ZooKeeperContainer container;
     protected CuratorFramework curator;
     protected ServiceDiscovery<ZooKeeperServiceRegistry.MetaData> discovery;
 
@@ -57,11 +56,11 @@ public abstract class ZooKeeperServiceRegistrationTestBase extends CamelTestSupp
     protected void doPreSetup() throws Exception {
         super.doPreSetup();
 
-        server = new ZooKeeperTestSupport.TestZookeeperServer(SERVER_PORT, true);
-        ZooKeeperTestSupport.waitForServerUp("127.0.0.1:" + SERVER_PORT, 1000);
+        container = new ZooKeeperContainer();
+        container.start();
 
         curator = CuratorFrameworkFactory.builder()
-            .connectString("127.0.0.1:" + SERVER_PORT)
+            .connectString(container.getConnectionString())
             .retryPolicy(new ExponentialBackoffRetry(1000, 3))
             .build();
 
@@ -83,7 +82,9 @@ public abstract class ZooKeeperServiceRegistrationTestBase extends CamelTestSupp
         CloseableUtils.closeQuietly(discovery);
         CloseableUtils.closeQuietly(curator);
 
-        server.shutdown();
+        if (container != null) {
+            container.stop();
+        }
     }
 
 
@@ -98,7 +99,7 @@ public abstract class ZooKeeperServiceRegistrationTestBase extends CamelTestSupp
         ZooKeeperServiceRegistry registry = new ZooKeeperServiceRegistry();
         registry.setId(context.getUuidGenerator().generateUuid());
         registry.setCamelContext(context());
-        registry.setNodes("localhost:" + SERVER_PORT);
+        registry.setNodes(container.getConnectionString());
         registry.setBasePath(SERVICE_PATH);
         registry.setServiceHost(SERVICE_HOST);
         registry.setOverrideServiceHost(true);
diff --git a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperClusteredRoutePolicyFactoryMain.java b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperClusteredRoutePolicyFactoryMain.java
index b7dc143..afa68ec 100644
--- a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperClusteredRoutePolicyFactoryMain.java
+++ b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperClusteredRoutePolicyFactoryMain.java
@@ -51,7 +51,7 @@ public final class ZooKeeperClusteredRoutePolicyFactoryMain {
             }
         });
 
-        main.addRouteBuilder(new RouteBuilder() {
+        main.addRoutesBuilder(new RouteBuilder() {
             @Override
             public void configure() throws Exception {
                 from("timer:clustered?delay=1s&period=1s")
diff --git a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperClusteredRoutePolicyFactoryTest.java b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperClusteredRoutePolicyFactoryTest.java
index 3540b3f..b3289c3 100644
--- a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperClusteredRoutePolicyFactoryTest.java
+++ b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperClusteredRoutePolicyFactoryTest.java
@@ -27,18 +27,15 @@ import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.zookeeper.ZooKeeperTestSupport;
-import org.apache.camel.component.zookeeper.ZooKeeperTestSupport.TestZookeeperServer;
+import org.apache.camel.component.zookeeper.ZooKeeperContainer;
 import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.impl.cluster.ClusteredRoutePolicyFactory;
-import org.apache.camel.test.AvailablePortFinder;
 import org.junit.Assert;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public final class ZooKeeperClusteredRoutePolicyFactoryTest {
-    private static final int PORT = AvailablePortFinder.getNextAvailable();
     private static final Logger LOGGER = LoggerFactory.getLogger(ZooKeeperClusteredRoutePolicyFactoryTest.class);
     private static final List<String> CLIENTS = IntStream.range(0, 3).mapToObj(Integer::toString).collect(Collectors.toList());
     private static final List<String> RESULTS = new ArrayList<>();
@@ -51,14 +48,15 @@ public final class ZooKeeperClusteredRoutePolicyFactoryTest {
 
     @Test
     public void test() throws Exception {
-        TestZookeeperServer server = null;
+        ZooKeeperContainer container = null;
 
         try {
-            server = new TestZookeeperServer(PORT, true);
-            ZooKeeperTestSupport.waitForServerUp("localhost:" + PORT, 1000);
+            container = new ZooKeeperContainer();
+            container.start();
 
+            String connectString = container.getConnectionString();
             for (String id : CLIENTS) {
-                SCHEDULER.submit(() -> run(id));
+                SCHEDULER.submit(() -> run(connectString, id));
             }
 
             LATCH.await(1, TimeUnit.MINUTES);
@@ -67,8 +65,8 @@ public final class ZooKeeperClusteredRoutePolicyFactoryTest {
             Assert.assertEquals(CLIENTS.size(), RESULTS.size());
             Assert.assertTrue(RESULTS.containsAll(CLIENTS));
         } finally {
-            if (server != null) {
-                server.shutdown();
+            if (container != null) {
+                container.stop();
             }
         }
     }
@@ -77,14 +75,14 @@ public final class ZooKeeperClusteredRoutePolicyFactoryTest {
     // Run a Camel node
     // ************************************
 
-    private static void run(String id) {
+    private static void run(String connectString, String id) {
         try {
             int events = ThreadLocalRandom.current().nextInt(2, 6);
             CountDownLatch contextLatch = new CountDownLatch(events);
 
             ZooKeeperClusterService service = new ZooKeeperClusterService();
             service.setId("node-" + id);
-            service.setNodes("localhost:" + PORT);
+            service.setNodes(connectString);
             service.setBasePath("/camel");
 
             DefaultCamelContext context = new DefaultCamelContext();
diff --git a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperClusteredRoutePolicyTest.java b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperClusteredRoutePolicyTest.java
index 33908a1..b686f74 100644
--- a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperClusteredRoutePolicyTest.java
+++ b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperClusteredRoutePolicyTest.java
@@ -27,18 +27,15 @@ import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.zookeeper.ZooKeeperTestSupport;
-import org.apache.camel.component.zookeeper.ZooKeeperTestSupport.TestZookeeperServer;
+import org.apache.camel.component.zookeeper.ZooKeeperContainer;
 import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.impl.cluster.ClusteredRoutePolicy;
-import org.apache.camel.test.AvailablePortFinder;
 import org.junit.Assert;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public final class ZooKeeperClusteredRoutePolicyTest {
-    private static final int PORT = AvailablePortFinder.getNextAvailable();
     private static final Logger LOGGER = LoggerFactory.getLogger(ZooKeeperClusteredRoutePolicyTest.class);
     private static final List<String> CLIENTS = IntStream.range(0, 3).mapToObj(Integer::toString).collect(Collectors.toList());
     private static final List<String> RESULTS = new ArrayList<>();
@@ -51,14 +48,15 @@ public final class ZooKeeperClusteredRoutePolicyTest {
 
     @Test
     public void test() throws Exception {
-        TestZookeeperServer server = null;
+        ZooKeeperContainer container = null;
 
         try {
-            server = new TestZookeeperServer(PORT, true);
-            ZooKeeperTestSupport.waitForServerUp("localhost:" + PORT, 1000);
+            container = new ZooKeeperContainer();
+            container.start();
 
+            String connectString = container.getConnectionString();
             for (String id : CLIENTS) {
-                SCHEDULER.submit(() -> run(id));
+                SCHEDULER.submit(() -> run(connectString, id));
             }
 
             LATCH.await(1, TimeUnit.MINUTES);
@@ -67,8 +65,8 @@ public final class ZooKeeperClusteredRoutePolicyTest {
             Assert.assertEquals(CLIENTS.size(), RESULTS.size());
             Assert.assertTrue(RESULTS.containsAll(CLIENTS));
         } finally {
-            if (server != null) {
-                server.shutdown();
+            if (container != null) {
+                container.stop();
             }
         }
     }
@@ -77,14 +75,14 @@ public final class ZooKeeperClusteredRoutePolicyTest {
     // Run a Camel node
     // ************************************
 
-    private static void run(String id) {
+    private static void run(String connectString, String id) {
         try {
             int events = ThreadLocalRandom.current().nextInt(2, 6);
             CountDownLatch contextLatch = new CountDownLatch(events);
 
             ZooKeeperClusterService service = new ZooKeeperClusterService();
             service.setId("node-" + id);
-            service.setNodes("localhost:" + PORT);
+            service.setNodes(connectString);
             service.setBasePath("/camel");
 
             DefaultCamelContext context = new DefaultCamelContext();
diff --git a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperMasterMain.java b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperMasterMain.java
index 0361531..5a9ea9d 100644
--- a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperMasterMain.java
+++ b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperMasterMain.java
@@ -51,7 +51,7 @@ public final class ZooKeeperMasterMain {
             }
         });
 
-        main.addRouteBuilder(new RouteBuilder() {
+        main.addRoutesBuilder(new RouteBuilder() {
             @Override
             public void configure() throws Exception {
                 final int delay = 1 + ThreadLocalRandom.current().nextInt(10);
diff --git a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperMasterTest.java b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperMasterTest.java
index 139372f..a2f29c5 100644
--- a/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperMasterTest.java
+++ b/components/camel-zookeeper/src/test/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperMasterTest.java
@@ -27,17 +27,14 @@ import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.zookeeper.ZooKeeperTestSupport;
-import org.apache.camel.component.zookeeper.ZooKeeperTestSupport.TestZookeeperServer;
+import org.apache.camel.component.zookeeper.ZooKeeperContainer;
 import org.apache.camel.impl.DefaultCamelContext;
-import org.apache.camel.test.AvailablePortFinder;
 import org.junit.Assert;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public final class ZooKeeperMasterTest {
-    private static final int PORT = AvailablePortFinder.getNextAvailable();
     private static final Logger LOGGER = LoggerFactory.getLogger(ZooKeeperMasterTest.class);
     private static final List<String> CLIENTS = IntStream.range(0, 3).mapToObj(Integer::toString).collect(Collectors.toList());
     private static final List<String> RESULTS = new ArrayList<>();
@@ -50,14 +47,15 @@ public final class ZooKeeperMasterTest {
 
     @Test
     public void test() throws Exception {
-        TestZookeeperServer server = null;
+        ZooKeeperContainer container = null;
 
         try {
-            server = new TestZookeeperServer(PORT, true);
-            ZooKeeperTestSupport.waitForServerUp("localhost:" + PORT, 1000);
+            container = new ZooKeeperContainer();
+            container.start();
 
+            String connectString = container.getConnectionString();
             for (String id : CLIENTS) {
-                SCHEDULER.submit(() -> run(id));
+                SCHEDULER.submit(() -> run(connectString, id));
             }
 
             LATCH.await(1, TimeUnit.MINUTES);
@@ -66,8 +64,8 @@ public final class ZooKeeperMasterTest {
             Assert.assertEquals(CLIENTS.size(), RESULTS.size());
             Assert.assertTrue(RESULTS.containsAll(CLIENTS));
         } finally {
-            if (server != null) {
-                server.shutdown();
+            if (container != null) {
+                container.stop();
             }
         }
     }
@@ -76,14 +74,14 @@ public final class ZooKeeperMasterTest {
     // Run a Camel node
     // ************************************
 
-    private static void run(String id) {
+    private static void run(String connectString, String id) {
         try {
             int events = ThreadLocalRandom.current().nextInt(2, 6);
             CountDownLatch contextLatch = new CountDownLatch(events);
 
             ZooKeeperClusterService service = new ZooKeeperClusterService();
             service.setId("node-" + id);
-            service.setNodes("localhost:" + PORT);
+            service.setNodes(connectString);
             service.setBasePath("/camel/master");
 
             DefaultCamelContext context = new DefaultCamelContext();
diff --git a/components/camel-zookeeper/src/test/resources/log4j2.properties b/components/camel-zookeeper/src/test/resources/log4j2.properties
index 98db0e3..8041ed2 100644
--- a/components/camel-zookeeper/src/test/resources/log4j2.properties
+++ b/components/camel-zookeeper/src/test/resources/log4j2.properties
@@ -48,5 +48,5 @@ logger.springframework.name = org.springframework
 logger.springframework.level = WARN
 
 rootLogger.level = INFO
-//rootLogger.appenderRef.stdout.ref = out
+rootLogger.appenderRef.stdout.ref = out
 rootLogger.appenderRef.file.ref = file
diff --git a/components/camel-zookeeper/src/test/resources/org/apache/camel/component/zookeeper/cloud/SpringZooKeeperServiceCallRouteTest.xml b/components/camel-zookeeper/src/test/resources/org/apache/camel/component/zookeeper/cloud/SpringZooKeeperServiceCallRouteTest.xml
index d5b4fd4..6345443 100644
--- a/components/camel-zookeeper/src/test/resources/org/apache/camel/component/zookeeper/cloud/SpringZooKeeperServiceCallRouteTest.xml
+++ b/components/camel-zookeeper/src/test/resources/org/apache/camel/component/zookeeper/cloud/SpringZooKeeperServiceCallRouteTest.xml
@@ -34,7 +34,7 @@
     <route id="scall">
       <from uri="direct:start"/>
       <serviceCall name="http-service" component="http">
-        <zookeeperServiceDiscovery nodes="localhost:9001" basePath="/camel"/>
+        <zookeeperServiceDiscovery nodes="{{container:host:zookeeper}}:{{container:port:2181@zookeeper}}" basePath="/camel"/>
       </serviceCall>
       <to uri="mock:result"/>
     </route>
diff --git a/components/camel-zookeeper/src/test/resources/org/apache/camel/component/zookeeper/cluster/SpringZooKeeperClusteredRouteConfigurationTest.xml b/components/camel-zookeeper/src/test/resources/org/apache/camel/component/zookeeper/cluster/SpringZooKeeperClusteredRouteConfigurationTest.xml
index c0ba63e..2b91015 100644
--- a/components/camel-zookeeper/src/test/resources/org/apache/camel/component/zookeeper/cluster/SpringZooKeeperClusteredRouteConfigurationTest.xml
+++ b/components/camel-zookeeper/src/test/resources/org/apache/camel/component/zookeeper/cluster/SpringZooKeeperClusteredRouteConfigurationTest.xml
@@ -25,11 +25,22 @@
          http://camel.apache.org/schema/spring
          http://camel.apache.org/schema/spring/camel-spring.xsd">
 
+  <bean id="zkContainer" class="org.apache.camel.component.zookeeper.ZooKeeperContainer" init-method="start" destroy-method="start">
+    <constructor-arg>
+      <value>zookeeper</value>
+    </constructor-arg>
+  </bean>
+
+  <bean id="zkConnectString" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
+    <property name="targetObject" ref="zkContainer"/>
+    <property name="targetMethod" value="getConnectionString">
+    </property>
+  </bean>
 
   <bean id="cluster-service" class="org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService">
     <property name="id" value="node-1"/>
     <property name="basePath" value="/camel/cluster"/>
-    <property name="nodes" value="localhost:2181"/>
+    <property name="nodes" ref="zkConnectString"/>
   </bean>
 
   <bean id="cluster-policy" class="org.apache.camel.impl.cluster.ClusteredRoutePolicyFactory" factory-method="forNamespace">