A specialized Testcontainers module that provides throwaway RabbitMQ containers for Java integration testing. This module extends GenericContainer to offer RabbitMQ-specific functionality including credential configuration, SSL/TLS setup, custom configuration files, and convenient access methods for AMQP and management endpoints.
Required Dependencies:
org.testcontainers:rabbitmq (this package)org.testcontainers:testcontainers is required (provided transitively)com.rabbitmq:amqp-client is recommended for connecting to the container (not required by testcontainers itself)Core Classes:
RabbitMQContainer - Main container class extending GenericContainer<RabbitMQContainer>RabbitMQContainer.SslVerification - Enum for SSL verification modes (VERIFY_NONE, VERIFY_PEER)GenericContainer including start(), stop(), execInContainer(), getLogs(), isRunning(), withEnv(), withNetwork(), withReuse(), withStartupTimeout()Default Behaviors:
rabbitmq:3.7.25-management-alpine (when using deprecated no-arg constructor)withStartupTimeout())withSSL())-management image variants (required for HTTP/HTTPS endpoints and rabbitmqadmin)Threading Model:
start() method blocks until container is ready (waits for health check)stop() method blocks until container is stopped@ClassRule or @Rule for JUnit 4, or @Container for JUnit 5 to manage lifecycleexecInContainer() executes synchronously and blocks until command completesLifecycle:
container.start() before usestart() returnscontainer.stop() for cleanupstop() even on errorsstart()execInContainer() can only be called after container has startedgetLogs() after startisRunning() returns true after successful start(), false after stop()Exceptions:
ContainerLaunchException - Container failed to start (timeout, image pull failure, port binding conflicts, etc.)IllegalStateException - Container not started when accessing ports/URLs (call start() first)PortBindingException - Port binding conflicts (rare, Testcontainers usually handles automatically)DockerNotAvailableException - Docker daemon not accessible (check Docker is running)ImagePullException - Failed to pull Docker image (network issues, invalid image tags)TimeoutException - Health check timeout (container started but not ready within timeout period)IOException from execInContainer() - Command execution failures (command not found, permission denied)TimeoutException from RabbitMQ clients - Connection timeout errors (container not ready, network issues)ShutdownSignalException from RabbitMQ clients - Connection closed unexpectedly (container stopped, network issues)IllegalArgumentException - Invalid configuration (null parameters, invalid file paths, invalid SSL configuration)Edge Cases:
withStartupTimeout(Duration.ofMinutes(2)))withReuse(true) to reuse containers across test runs (requires testcontainers.properties configuration)withNetwork() and withNetworkAliases() for multi-container testsstart() to return before connecting clients; container may need additional time to be fully ready (add small delay if needed)-management image variantsgetLogs() sparingly or with limitsCommon Patterns:
@Container (JUnit 5) or @ClassRule (JUnit 4) for automatic lifecycle managementIntegration Points:
com.rabbitmq:amqp-client) for AMQP operations@ClassRule, @Rule) and JUnit 5 (@Container, @Testcontainers)Package Name: org.testcontainers:rabbitmq
Package Type: maven
Language: Java
Installation:
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>rabbitmq</artifactId>
<version>1.21.4</version>
<scope>test</scope>
</dependency>Gradle:
testImplementation 'org.testcontainers:rabbitmq:1.21.4'import org.testcontainers.containers.RabbitMQContainer;
import org.testcontainers.utility.DockerImageName;For SSL configuration:
import org.testcontainers.containers.RabbitMQContainer.SslVerification;
import org.testcontainers.utility.MountableFile;For RabbitMQ client:
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Channel;For container execution:
import org.testcontainers.containers.ExecResult;import org.testcontainers.containers.RabbitMQContainer;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Channel;
// Create and start RabbitMQ container
try (RabbitMQContainer rabbitmq = new RabbitMQContainer(
DockerImageName.parse("rabbitmq:3.7.25-management-alpine"))) {
rabbitmq.start();
// Get connection details
String amqpUrl = rabbitmq.getAmqpUrl();
String username = rabbitmq.getAdminUsername(); // "guest"
String password = rabbitmq.getAdminPassword(); // "guest"
// Connect using RabbitMQ Java client
ConnectionFactory factory = new ConnectionFactory();
factory.setUri(amqpUrl);
factory.setUsername(username);
factory.setPassword(password);
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
// Use RabbitMQ for testing
channel.queueDeclare("test-queue", false, false, false, null);
channel.basicPublish("", "test-queue", null, "Hello".getBytes());
}
// Container automatically stops and removes when try-with-resources completes
}import org.testcontainers.containers.RabbitMQContainer;
import org.testcontainers.utility.DockerImageName;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Channel;
RabbitMQContainer rabbitmq = null;
Connection connection = null;
try {
rabbitmq = new RabbitMQContainer(
DockerImageName.parse("rabbitmq:3.7.25-management-alpine"));
rabbitmq.start();
ConnectionFactory factory = new ConnectionFactory();
factory.setUri(rabbitmq.getAmqpUrl());
factory.setUsername(rabbitmq.getAdminUsername());
factory.setPassword(rabbitmq.getAdminPassword());
factory.setConnectionTimeout(5000);
connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare("test-queue", false, false, false, null);
channel.basicPublish("", "test-queue", null, "Hello".getBytes());
} catch (Exception e) {
System.err.println("Test failed: " + e.getMessage());
throw e;
} finally {
if (connection != null) {
try {
connection.close();
} catch (Exception e) {
// Log but don't throw
}
}
if (rabbitmq != null) {
rabbitmq.stop();
}
}try (RabbitMQContainer rabbitmq = new RabbitMQContainer(
DockerImageName.parse("rabbitmq:3.7.25-management-alpine"))
.withAdminUser("admin")
.withAdminPassword("secretpassword")) {
rabbitmq.start();
// Use with custom credentials
ConnectionFactory factory = new ConnectionFactory();
factory.setUri(rabbitmq.getAmqpUrl());
factory.setUsername(rabbitmq.getAdminUsername()); // "admin"
factory.setPassword(rabbitmq.getAdminPassword()); // "secretpassword"
Connection connection = factory.newConnection();
// Use connection for testing
}import org.junit.jupiter.api.Test;
import org.testcontainers.containers.RabbitMQContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.utility.DockerImageName;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
@Testcontainers
public class RabbitMQIntegrationTest {
@Container
static RabbitMQContainer rabbitmq = new RabbitMQContainer(
DockerImageName.parse("rabbitmq:3.7.25-management-alpine"));
@Test
public void testRabbitMQConnection() throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setUri(rabbitmq.getAmqpUrl());
factory.setUsername(rabbitmq.getAdminUsername());
factory.setPassword(rabbitmq.getAdminPassword());
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare("test-queue", false, false, false, null);
channel.basicPublish("", "test-queue", null, "Hello".getBytes());
}
}
}import org.junit.ClassRule;
import org.junit.Test;
import org.testcontainers.containers.RabbitMQContainer;
import org.testcontainers.utility.DockerImageName;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
public class RabbitMQIntegrationTest {
@ClassRule
public static RabbitMQContainer rabbitmq = new RabbitMQContainer(
DockerImageName.parse("rabbitmq:3.7.25-management-alpine"));
@Test
public void testRabbitMQConnection() throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setUri(rabbitmq.getAmqpUrl());
factory.setUsername(rabbitmq.getAdminUsername());
factory.setPassword(rabbitmq.getAdminPassword());
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare("test-queue", false, false, false, null);
channel.basicPublish("", "test-queue", null, "Hello".getBytes());
}
}
}RabbitMQContainer extends the Testcontainers GenericContainer class, providing:
execInContainer() method for executing rabbitmqctl and rabbitmqadmin commandsThe container exposes four ports:
Default configuration uses the official RabbitMQ Docker image with management plugin enabled (rabbitmq:3.7.25-management-alpine) and guest/guest credentials.
Create RabbitMQ containers with default or custom Docker images.
/**
* Creates a RabbitMQ container using the default official RabbitMQ docker image.
* @deprecated use RabbitMQContainer(DockerImageName) instead
*/
@Deprecated
public RabbitMQContainer()
/**
* Creates a RabbitMQ container using a specific docker image.
* @param dockerImageName The docker image to use
*/
public RabbitMQContainer(String dockerImageName)
/**
* Creates a RabbitMQ container using a specific DockerImageName.
* @param dockerImageName The docker image to use
*/
public RabbitMQContainer(DockerImageName dockerImageName)Usage Examples:
// Recommended: Use DockerImageName for version pinning
RabbitMQContainer container = new RabbitMQContainer(
DockerImageName.parse("rabbitmq:3.7.25-management-alpine"));
// Alternative: String constructor (less type-safe)
RabbitMQContainer container = new RabbitMQContainer("rabbitmq:3.7.25-management-alpine");
// Use specific version
RabbitMQContainer container = new RabbitMQContainer(
DockerImageName.parse("rabbitmq:3.12-management-alpine"));Configure RabbitMQ container with custom credentials, SSL/TLS certificates, and configuration files. Includes methods for setting admin username and password, enabling SSL with custom certificates, and mounting custom RabbitMQ configuration files in sysctl or erlang formats.
public RabbitMQContainer withAdminUser(String adminUsername)
public RabbitMQContainer withAdminPassword(String adminPassword)
public String getAdminUsername()
public String getAdminPassword()
public RabbitMQContainer withSSL(
MountableFile keyFile,
MountableFile certFile,
MountableFile caFile,
SslVerification verify
)
public RabbitMQContainer withRabbitMQConfig(MountableFile rabbitMQConf)
public RabbitMQContainer withRabbitMQConfigSysctl(MountableFile rabbitMQConf)
public RabbitMQContainer withRabbitMQConfigErlang(MountableFile rabbitMQConf)
public enum SslVerification {
VERIFY_NONE,
VERIFY_PEER
}Retrieve connection URLs and mapped ports for AMQP, AMQPS, HTTP, and HTTPS endpoints. These methods provide the host and port information needed to connect to the RabbitMQ container from your test code.
public Integer getAmqpPort()
public Integer getAmqpsPort()
public Integer getHttpPort()
public Integer getHttpsPort()
public String getAmqpUrl()
public String getAmqpsUrl()
public String getHttpUrl()
public String getHttpsUrl()Legacy declarative methods for configuring RabbitMQ entities (queues, exchanges, bindings, users, vhosts, policies). These methods are deprecated in favor of using the inherited execInContainer(String...) method to execute rabbitmqadmin or rabbitmqctl commands directly after the container starts.
@Deprecated public RabbitMQContainer withPluginsEnabled(String... pluginNames)
@Deprecated public RabbitMQContainer withQueue(String name)
@Deprecated public RabbitMQContainer withExchange(String name, String type)
@Deprecated public RabbitMQContainer withBinding(String source, String destination)
@Deprecated public RabbitMQContainer withUser(String name, String password)
@Deprecated public RabbitMQContainer withVhost(String name)
@Deprecated public RabbitMQContainer withPolicy(String name, String pattern, Map<String, Object> definition)
@Deprecated public RabbitMQContainer withPermission(String vhost, String user, String configure, String write, String read)RabbitMQContainer inherits all methods from GenericContainer<RabbitMQContainer>, including:
For RabbitMQ administration tasks, prefer using execInContainer() to execute rabbitmqctl or rabbitmqadmin commands directly:
// Execute rabbitmqctl command
ExecResult result = container.execInContainer("rabbitmqctl", "list_queues");
System.out.println(result.getStdout());
// Execute rabbitmqadmin command
container.execInContainer("rabbitmqadmin", "declare", "queue", "name=my-queue");
// Check command success
ExecResult result = container.execInContainer("rabbitmqctl", "status");
if (result.getExitCode() != 0) {
throw new RuntimeException("Command failed: " + result.getStderr());
}// Enable container reuse (requires testcontainers.properties configuration)
RabbitMQContainer container = new RabbitMQContainer(
DockerImageName.parse("rabbitmq:3.7.25-management-alpine"))
.withReuse(true);import org.testcontainers.containers.Network;
Network network = Network.newNetwork();
RabbitMQContainer rabbitmq = new RabbitMQContainer(
DockerImageName.parse("rabbitmq:3.7.25-management-alpine"))
.withNetwork(network)
.withNetworkAliases("rabbitmq");import java.time.Duration;
RabbitMQContainer container = new RabbitMQContainer(
DockerImageName.parse("rabbitmq:3.7.25-management-alpine"))
.withStartupTimeout(Duration.ofMinutes(2));RabbitMQContainer container = new RabbitMQContainer(
DockerImageName.parse("rabbitmq:3.7.25-management-alpine"));
try {
container.start();
} catch (Exception e) {
// Print container logs for debugging
System.err.println("Container logs:\n" + container.getLogs());
throw e;
}try (RabbitMQContainer rabbitmq = new RabbitMQContainer(
DockerImageName.parse("rabbitmq:3.7.25-management-alpine"))) {
rabbitmq.start();
ConnectionFactory factory = new ConnectionFactory();
factory.setUri(rabbitmq.getAmqpUrl());
factory.setUsername(rabbitmq.getAdminUsername());
factory.setPassword(rabbitmq.getAdminPassword());
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
// Declare exchange
channel.exchangeDeclare("test-exchange", "topic", true);
// Declare queue
channel.queueDeclare("test-queue", true, false, false, null);
// Bind queue to exchange
channel.queueBind("test-queue", "test-exchange", "test.routing.key");
// Publish message
channel.basicPublish("test-exchange", "test.routing.key", null,
"Hello RabbitMQ".getBytes());
}
}try (RabbitMQContainer rabbitmq = new RabbitMQContainer(
DockerImageName.parse("rabbitmq:3.7.25-management-alpine"))) {
rabbitmq.start();
// Create virtual host
ExecResult result = rabbitmq.execInContainer(
"rabbitmqctl", "add_vhost", "test-vhost");
if (result.getExitCode() != 0) {
throw new RuntimeException("Failed to create vhost: " + result.getStderr());
}
// List virtual hosts
ExecResult listResult = rabbitmq.execInContainer(
"rabbitmqctl", "list_vhosts");
System.out.println("Virtual hosts: " + listResult.getStdout());
}