ahj*_*ton 16 java integration-testing automated-tests amqp rabbitmq
我正在尝试为连接到RabbitMQ代理的Scala/Java应用程序创建集成测试.为了达到这个目的,我想要一个能够在每次测试之前开始和停止的AMQP的嵌入式代理.最初我尝试将ActiveMQ作为嵌入式代理引入AMQP,但是应用程序使用RabbitMQ只能说AMQP版本0.9.3而ActiveMQ需要AMQP版本1.0.
我可以使用另一个嵌入式代理来代替ActiveMQ吗?
Sto*_*ica 13
一个完全内存的解决方案.spring.*根据需要替换属性.
<dependency>
<groupId>org.apache.qpid</groupId>
<artifactId>qpid-broker</artifactId>
<version>6.1.1</version>
<scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
public class EmbeddedBroker {
public void start() {
Broker broker = new Broker();
BrokerOptions brokerOptions = new BrokerOptions();
brokerOptions.setConfigProperty("qpid.amqp_port", environment.getProperty("spring.rabbitmq.port"));
brokerOptions.setConfigProperty("qpid.broker.defaultPreferenceStoreAttributes", "{\"type\": \"Noop\"}");
brokerOptions.setConfigProperty("qpid.vhost", environment.getProperty("spring.rabbitmq.virtual-host"));
brokerOptions.setConfigurationStoreType("Memory");
brokerOptions.setStartupLoggedToSystemOut(false);
broker.startup(brokerOptions);
}
}
Run Code Online (Sandbox Code Playgroud)
添加initial-config.json为资源:
{
"name": "Embedded Test Broker",
"modelVersion": "6.1",
"authenticationproviders" : [{
"name": "password",
"type": "Plain",
"secureOnlyMechanisms": [],
"users": [{"name": "guest", "password": "guest", "type": "managed"}]
}],
"ports": [{
"name": "AMQP",
"port": "${qpid.amqp_port}",
"authenticationProvider": "password",
"protocols": [ "AMQP_0_9_1" ],
"transports": [ "TCP" ],
"virtualhostaliases": [{
"name": "${qpid.vhost}",
"type": "nameAlias"
}]
}],
"virtualhostnodes" : [{
"name": "${qpid.vhost}",
"type": "Memory",
"virtualHostInitialConfiguration": "{ \"type\": \"Memory\" }"
}]
}
Run Code Online (Sandbox Code Playgroud)
我已经开发了一个包装器,用于下载,提取,启动和管理RabbitMQ,因此它可以像任何JVM项目控制的嵌入式服务一样工作.
看看:https://github.com/AlejandroRivera/embedded-rabbitmq
它很简单:
EmbeddedRabbitMqConfig config = new EmbeddedRabbitMqConfig.Builder()
.version(PredefinedVersion.V3_5_7)
.build();
EmbeddedRabbitMq rabbitMq = new EmbeddedRabbitMq(config);
rabbitMq.start();
...
rabbitMq.stop();
Run Code Online (Sandbox Code Playgroud)
适用于Linux,Mac和Windows.
以下是OrangeDog提出的适用于Qpid Broker 7.x的解决方案,灵感来自于此:
添加qpid 7.x作为测试依赖项.在7.x中,这些已经在核心+插件中分离,具体取决于您的需要.对于RabbitMQ AMQP版本,您需要qpid-broker-plugins-amqp-0-8-protocol并在内存中运行(足以进行集成测试)qpid-broker-plugins-memory-store.
pom.xml:
...
<properties>
...
<qpid-broker.version>7.0.2</qpid-broker.version>
</properties>
<dependencies>
...
<dependency>
<groupId>org.apache.qpid</groupId>
<artifactId>qpid-broker-core</artifactId>
<version>${qpid-broker.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.qpid</groupId>
<artifactId>qpid-broker-plugins-amqp-0-8-protocol</artifactId>
<version>${qpid-broker.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.qpid</groupId>
<artifactId>qpid-broker-plugins-memory-store</artifactId>
<version>${qpid-broker.version}</version>
<scope>test</scope>
</dependency>
</dependecies>
...
Run Code Online (Sandbox Code Playgroud)
使用硬编码的用户/密码添加代理配置,并将默认的内存虚拟主机映射到默认端口(5672):
qpid-config.json:
{
"name": "EmbeddedBroker",
"modelVersion": "7.0",
"authenticationproviders": [
{
"name": "password",
"type": "Plain",
"secureOnlyMechanisms": [],
"users": [{"name": "guest", "password": "guest", "type": "managed"}]
}
],
"ports": [
{
"name": "AMQP",
"port": "${qpid.amqp_port}",
"authenticationProvider": "password",
"virtualhostaliases": [
{
"name": "defaultAlias",
"type": "defaultAlias"
}
]
}
],
"virtualhostnodes": [
{
"name": "default",
"defaultVirtualHostNode": "true",
"type": "Memory",
"virtualHostInitialConfiguration": "{\"type\": \"Memory\" }"
}
]
}
Run Code Online (Sandbox Code Playgroud)
定义junit ExternalResource并声明为ClassRule(或在您的IT @BeforeClass和@AfterClass方法中启动和关闭嵌入式代理):
EmbeddedAMQPBroker.java:
public class EmbeddedAMQPBroker extends ExternalResource {
private final SystemLauncher broker = new SystemLauncher();
@Override
protected void before() throws Throwable {
startQpidBroker();
//createExchange();
}
@Override
protected void after() {
broker.shutdown();
}
private void startQpidBroker() throws Exception {
Map<String, Object> attributes = new HashMap<>();
attributes.put("type", "Memory");
attributes.put("initialConfigurationLocation", findResourcePath("qpid-config.json"));
broker.startup(attributes);
}
private String findResourcePath(final String fileName) {
return EmbeddedAMQPBroker.class.getClassLoader().getResource(fileName).toExternalForm();
}
}
Run Code Online (Sandbox Code Playgroud)
整合测试:
public class MessagingIT{
@ClassRule
public static EmbeddedAMQPBroker embeddedAMQPBroker = new EmbeddedAMQPBroker();
...
}
Run Code Online (Sandbox Code Playgroud)