Testcontainers RabbitMQ module for integration testing with throwaway RabbitMQ container instances
npx @tessl/cli install tessl/maven-org-testcontainers--rabbitmq@1.21.0Testcontainers RabbitMQ module provides a specialized container implementation for integration testing with RabbitMQ message brokers. It enables developers to easily spin up throwaway RabbitMQ container instances for JUnit tests, supporting both AMQP and AMQPS protocols along with HTTP and HTTPS management interfaces.
build.gradle: testImplementation "org.testcontainers:rabbitmq:1.21.3"pom.xml: <groupId>org.testcontainers</groupId><artifactId>rabbitmq</artifactId><version>1.21.3</version>import org.testcontainers.containers.RabbitMQContainer;
import org.testcontainers.utility.DockerImageName;
import org.testcontainers.utility.MountableFile;For SSL configuration:
import org.testcontainers.containers.RabbitMQContainer.SslVerification;For testing utilities:
import org.testcontainers.containers.RabbitMQTestImages;import org.testcontainers.containers.RabbitMQContainer;
import org.testcontainers.containers.RabbitMQTestImages;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
@Test
public void testRabbitMQ() {
try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) {
container.start();
// Get connection details
String amqpUrl = container.getAmqpUrl();
String adminUser = container.getAdminUsername();
String adminPassword = container.getAdminPassword();
// Create AMQP connection
ConnectionFactory factory = new ConnectionFactory();
factory.setUri(amqpUrl);
factory.setUsername(adminUser);
factory.setPassword(adminPassword);
try (Connection connection = factory.newConnection()) {
// Use the connection for testing
assertThat(connection.isOpen()).isTrue();
}
}
}The RabbitMQContainer extends Testcontainers' GenericContainer with RabbitMQ-specific functionality:
Core container instantiation and basic configuration options.
// Constructors
public RabbitMQContainer(DockerImageName dockerImageName);
public RabbitMQContainer(String dockerImageName);
@Deprecated
public RabbitMQContainer();
// Basic configuration
public RabbitMQContainer withAdminUser(String adminUsername);
public RabbitMQContainer withAdminPassword(String adminPassword);Methods to retrieve connection details and URLs for different protocols.
// Credential access
public String getAdminUsername();
public String getAdminPassword();
// Port access
public Integer getAmqpPort();
public Integer getAmqpsPort();
public Integer getHttpPort();
public Integer getHttpsPort();
// URL generation
public String getAmqpUrl();
public String getAmqpsUrl();
public String getHttpUrl();
public String getHttpsUrl();SSL certificate configuration for secure connections.
public RabbitMQContainer withSSL(
MountableFile keyFile,
MountableFile certFile,
MountableFile caFile,
SslVerification verify
);
public RabbitMQContainer withSSL(
MountableFile keyFile,
MountableFile certFile,
MountableFile caFile,
SslVerification verify,
boolean failIfNoCert
);
public RabbitMQContainer withSSL(
MountableFile keyFile,
MountableFile certFile,
MountableFile caFile,
SslVerification verify,
boolean failIfNoCert,
int verificationDepth
);Custom RabbitMQ configuration file support.
// Generic config (delegates to sysctl format)
public RabbitMQContainer withRabbitMQConfig(MountableFile rabbitMQConf);
// Sysctl format (RabbitMQ >= 3.7)
public RabbitMQContainer withRabbitMQConfigSysctl(MountableFile rabbitMQConf);
// Erlang format
public RabbitMQContainer withRabbitMQConfigErlang(MountableFile rabbitMQConf);Inherited methods from GenericContainer for container lifecycle management.
// Container lifecycle
public void start();
public void stop();
public void close();
public boolean isRunning();
// Container interaction
public String getLogs();
public ExecResult execInContainer(String... command) throws IOException, InterruptedException;Legacy methods for programmatic RabbitMQ entity creation. Use execInContainer() instead.
// Plugin management
@Deprecated
public RabbitMQContainer withPluginsEnabled(String... pluginNames);
// Queue management
@Deprecated
public RabbitMQContainer withQueue(String name);
@Deprecated
public RabbitMQContainer withQueue(String vhost, String name);
@Deprecated
public RabbitMQContainer withQueue(String name, boolean autoDelete, boolean durable, Map<String, Object> arguments);
@Deprecated
public RabbitMQContainer withQueue(String vhost, String name, boolean autoDelete, boolean durable, Map<String, Object> arguments);
// Exchange management
@Deprecated
public RabbitMQContainer withExchange(String name, String type);
@Deprecated
public RabbitMQContainer withExchange(String vhost, String name, String type);
@Deprecated
public RabbitMQContainer withExchange(String name, String type, boolean autoDelete, boolean internal, boolean durable, Map<String, Object> arguments);
@Deprecated
public RabbitMQContainer withExchange(String vhost, String name, String type, boolean autoDelete, boolean internal, boolean durable, Map<String, Object> arguments);
// Binding management
@Deprecated
public RabbitMQContainer withBinding(String source, String destination);
@Deprecated
public RabbitMQContainer withBinding(String vhost, String source, String destination);
@Deprecated
public RabbitMQContainer withBinding(String source, String destination, Map<String, Object> arguments, String routingKey, String destinationType);
@Deprecated
public RabbitMQContainer withBinding(String vhost, String source, String destination, Map<String, Object> arguments, String routingKey, String destinationType);
// User and permission management
@Deprecated
public RabbitMQContainer withUser(String name, String password);
@Deprecated
public RabbitMQContainer withUser(String name, String password, Set<String> tags);
@Deprecated
public RabbitMQContainer withPermission(String vhost, String user, String configure, String write, String read);
// Virtual host management
@Deprecated
public RabbitMQContainer withVhost(String name);
@Deprecated
public RabbitMQContainer withVhost(String name, boolean tracing);
@Deprecated
public RabbitMQContainer withVhostLimit(String vhost, String name, int value);
// Policy management
@Deprecated
public RabbitMQContainer withPolicy(String name, String pattern, Map<String, Object> definition);
@Deprecated
public RabbitMQContainer withPolicy(String vhost, String name, String pattern, Map<String, Object> definition);
@Deprecated
public RabbitMQContainer withPolicy(String name, String pattern, Map<String, Object> definition, int priority, String applyTo);
@Deprecated
public RabbitMQContainer withOperatorPolicy(String name, String pattern, Map<String, Object> definition);
@Deprecated
public RabbitMQContainer withOperatorPolicy(String name, String pattern, Map<String, Object> definition, int priority, String applyTo);
// Parameter management
@Deprecated
public RabbitMQContainer withParameter(String component, String name, String value);// SSL verification options
public enum SslVerification {
VERIFY_NONE("verify_none"), // No SSL peer verification
VERIFY_PEER("verify_peer") // Verify SSL peer certificates
}
// Test image constants
public interface RabbitMQTestImages {
DockerImageName RABBITMQ_IMAGE = DockerImageName.parse("rabbitmq:3.7.25-management-alpine");
}
// Container execution result
interface ExecResult {
String getStdout();
String getStderr();
int getExitCode();
}@Test
public void testWithCustomCredentials() {
try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)
.withAdminUser("admin")
.withAdminPassword("secret123")) {
container.start();
assertEquals("admin", container.getAdminUsername());
assertEquals("secret123", container.getAdminPassword());
}
}@Test
public void testWithSSL() {
MountableFile keyFile = MountableFile.forClasspathResource("ssl/server.key");
MountableFile certFile = MountableFile.forClasspathResource("ssl/server.crt");
MountableFile caFile = MountableFile.forClasspathResource("ssl/ca.crt");
try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)
.withSSL(keyFile, certFile, caFile, SslVerification.VERIFY_PEER)) {
container.start();
String amqpsUrl = container.getAmqpsUrl();
assertTrue(amqpsUrl.startsWith("amqps://"));
}
}@Test
public void testWithModernConfiguration() throws Exception {
try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) {
container.start();
// Use execInContainer for RabbitMQ configuration
container.execInContainer("rabbitmq-plugins", "enable", "rabbitmq_management");
container.execInContainer("rabbitmqadmin", "declare", "queue", "name=test-queue");
container.execInContainer("rabbitmqadmin", "declare", "exchange", "name=test-exchange", "type=direct");
container.execInContainer("rabbitmqadmin", "declare", "binding",
"source=test-exchange", "destination=test-queue");
// Verify configuration
ExecResult result = container.execInContainer("rabbitmqctl", "list_queues");
assertTrue(result.getStdout().contains("test-queue"));
}
}@Test
public void testWithCustomConfig() {
MountableFile configFile = MountableFile.forClasspathResource("rabbitmq-custom.conf");
try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)
.withRabbitMQConfigSysctl(configFile)) {
container.start();
// Container will use the custom configuration
}
}