Scala/Java RabbitMQブローカーに接続するアプリケーション)の統合テストを作成しようとしています。これを実現するには、AMQPを話す組み込みブローカーが必要です各テストの前に開始および停止します。元々は、AMQPを組み込んだブローカーとしてActiveMQを導入しようとしましたが、アプリケーションはRabbitMQを使用するため、AMQPバージョン0.9.3しか話せませんが、ActiveMQにはAMQPバージョン1.0が必要です。
ActiveMQの代わりに使用できる別の組み込みブローカーはありますか?
完全にメモリ内のソリューション。 spring.*
プロパティは必要に応じて。
<dependency>
<groupId>org.Apache.qpid</groupId>
<artifactId>qpid-broker</artifactId>
<version>6.1.1</version>
<scope>test</scope>
</dependency>
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);
}
}
追加 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\" }"
}]
}
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();
Linux、Mac、Windowsで動作します。
here からインスピレーションを得て、Qpid Broker 7.xに適合したOrangeDogによって提案されたソリューションを次に示します。
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>
...
ハードコードされたユーザー/パスワードとデフォルトのメモリ内仮想ホストをデフォルトのポート(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\" }"
}
]
}
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();
}
}
統合テスト:
public class MessagingIT{
@ClassRule
public static EmbeddedAMQPBroker embeddedAMQPBroker = new EmbeddedAMQPBroker();
...
}
私は組み込みのRabbitMQサーバーを認識していませんので、これを回避するためのオプションがいくつかあると思います。
RabbitMQサーバーはCIサーバー上に存在する必要はありません。CIrabbitmqサーバーである新しいサーバーを起動できます。自分で作成できない場合は、 CloudAMQP を調べてください。今日の無料枠では、1か月に100万メッセージ、20同時接続、100キュー、10,000キューメッセージが提供されます。 CIプロセスには十分かもしれません。
テストがRabbitMQの単体テストのみで行われている場合は、RabbitMQメッセージ生成を模擬できます。これは、単体テストの一部で行うことです。特定の操作がメソッドを呼び出して特定のメッセージを生成することを確認するだけですが、これをモックアウトして実際にメッセージを公開しないようにします。次に、作成した特定のメッセージを使用してコンシューマーメソッドを明示的に呼び出すことにより、各コンシューマーをテストします。
Apache QPid Java broker を試すことができます。これは組み込みブローカーとして使用できます。
Scalaは別のセクションで説明されていますSO質問- スタンドアロンApache Qpid(amqp)Junitテストの例