2015-06-18 19 views
9

Ich versuche, einen Integrationstest für eine Scala/Java-Anwendung zu erstellen, die eine Verbindung zu einem RabbitMQ-Broker herstellt. Um dies zu erreichen, möchte ich einen eingebetteten Broker, der AMQP spricht und vor jedem Test startet und stoppt. Ursprünglich habe ich versucht, ActiveMQ als Embedded Broker mit AMQP einzuführen, aber die Anwendung verwendet RabbitMQ und spricht daher nur AMQP Version 0.9.3, während ActiveMQ AMQP Version 1.0 benötigt.Embedded AMQP Java Broker

Gibt es einen anderen eingebetteten Broker, den ich anstelle von ActiveMQ verwenden kann?

+1

RabbitMQ implementiert AMQP 0,8; 0.9.1 und AMQP 1.0. Wenn Sie einen Mac benutzen, ist es relativ einfach, rabbitmq für Ihre Tests zu starten/stoppen. Dies ist für PHP aber könnte Ihnen in Ihrem Anwendungsfall helfen http://videlalvaro.github.io/2013/04/using-rabbitmq-in-unit-tests.html –

+0

Hallo @old_sound, danke für die Untersuchung. Idealerweise möchte ich vermeiden, dass rabbitmq auf der Box zum Testen benötigt, unsere Tests laufen auf einem CI-Server, den wir RabbitMQ nicht einfach installieren können. – ahjmorton

+0

Ist auf diesem CI-Server mindestens Erlang installiert?Wenn ja, können Sie einfach den Hasen - Tarball herunterladen, dekomprimieren und für die Tests starten/stoppen. –

Antwort

3

Ich bin nicht bekannt, dass eingebettete RabbitMQ Server so dass ich glaube, Sie haben ein paar Optionen, dies zu umgehen:

  1. Ihr RabbitMQ Server muss nicht auf dem CI-Server vorhanden ist, können Sie bringen ein neuer Server, der Ihr CI-Rabbitmq-Server ist. Wenn Sie nicht selbst einen bringen können, könnten Sie in CloudAMQP schauen. Das kostenlose Tier bietet heute: 1M Nachrichten pro Monat, 20 gleichzeitige Verbindungen, 100 Warteschlangen, 10.000 Nachrichten in der Warteschlange. Könnte für Ihren CI-Prozess ausreichen.

  2. Wenn Ihre Tests nur Komponententests für RabbitMQ durchgeführt werden, können Sie Ihre RabbitMQ-Nachrichtenproduktion ausspionieren. Das machen wir in einigen unserer Unit-Tests. Wir überprüfen nur, ob eine bestimmte Operation den Methodenaufruf veranlasst, eine bestimmte Nachricht zu erzeugen, aber wir machen uns das etwas vor, so dass wir keine Nachricht veröffentlichen. Dann testen wir jeden der Konsumenten, indem wir die Consumer-Methoden explizit mit einer spezifischen Nachricht aufrufen, die wir erstellt haben.

6

ich einen Wrapper des Herunterladens um den Prozess entwickelt habe, Extrahieren, das Startens und Verwalten von RabbitMQ so dass es wie ein eingebetteten Dienst gesteuert von einem JVM Projekt arbeiten kann .

Check it out: https://github.com/AlejandroRivera/embedded-rabbitmq

Es ist so einfach wie:

EmbeddedRabbitMqConfig config = new EmbeddedRabbitMqConfig.Builder() 
    .version(PredefinedVersion.V3_5_7) 
    .build(); 
EmbeddedRabbitMq rabbitMq = new EmbeddedRabbitMq(config); 
rabbitMq.start(); 
... 
rabbitMq.stop(); 

Arbeiten auf Linux, Mac und Windows.

+0

Ich kann bestätigen, dass das funktioniert! Ich benutze diese Bibliothek in meinem Unit Testing (Spring Bases-Anwendung), um eine temporäre RabbitMq-Umgebung zu erstellen ... – cgval

+2

Funktioniert gut, aber ERL muss vorinstalliert sein ist ein Problem für mich. – deFreitas

10

Eine vollständige In-Memory-Lösung. Ersetzen Sie die Eigenschaften spring.* wie erforderlich.

<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); 
    } 
} 

hinzufügen initial-config.json als Ressource:

{ 
    "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\" }" 
    }] 
} 
+1

Danke !!! funktioniert wie ein Charm – jamming

+0

Beachten Sie, dass wenn Ihre Anwendung in Prod eine Verbindung zu RabbitMQ herstellt, Sie möglicherweise Inkonsistenzen feststellen, wenn Sie für Integrationstests an Apache QPid binden. RabbitMQ hat AMQP erweitert, um zusätzliche Funktionen bereitzustellen, auf die Ihre Anwendung möglicherweise angewiesen ist (z. B. TTLs, DLE/Qs, Routing, ...). Mehr Infos https://www.rabbitmq.com/extensions.html – Alejandro

+0

QPid hat das meiste auch, nur mit anderen Namen. – OrangeDog