2015-06-18 20 views
9

Sto provando a creare test di integrazione per un'applicazione Scala/Java che si connette a un broker RabbitMQ. Per ottenere questo mi piacerebbe un broker embedded che parli di AMQP che inizio e fermassi prima di ogni test. Inizialmente ho provato a introdurre ActiveMQ come un broker incorporato con AMQP, tuttavia l'applicazione utilizza RabbitMQ, quindi parla solo AMQP versione 0.9.3 mentre ActiveMQ richiede AMQP versione 1.0.Embedded Java Broker AMQP

C'è un altro broker incorporato che posso usare al posto di ActiveMQ?

+1

RabbitMQ implementa AMQP 0.8; 0.9.1 e AMQP 1.0. Se stai usando un Mac, è abbastanza facile avviare/fermare rabbitmq per i tuoi test. Questo è per PHP ma potrebbe aiutarti nel tuo caso d'uso http://videlalvaro.github.io/2013/04/using-rabbitmq-in-unit-tests.html –

+0

Ciao @old_sound, grazie per averlo esaminato. Idealmente vorrei evitare di richiedere rabbitmq sulla scatola per testare, i nostri test girano su un server CI che non possiamo installare facilmente RabbitMQ. – ahjmorton

+0

Questo server CI ha almeno installato Erlang?Se sì, puoi solo scaricare il tarball di coniglio, decomprimerlo e avviarlo/fermarlo per i test –

risposta

3

Io non sono a conoscenza di alcun server RabbitMQ incorporati quindi penso di avere un paio di opzioni per risolvere questo:

  1. Il server RabbitMQ non ha bisogno di esistere sul server CI, è possibile far apparire un nuovo server che è il tuo server rabbitmq CI. Se non riesci a portartelo da solo, puoi controllare CloudAMQP. Il livello gratuito offre oggi: 1 milione di messaggi al mese, 20 connessioni simultanee, 100 code, 10.000 messaggi in coda. Potrebbe essere sufficiente per il tuo processo CI.

  2. Se il test viene eseguito solo su unit test per RabbitMQ, è possibile prendere in giro la produzione del messaggio RabbitMQ. Questo è ciò che facciamo in alcuni dei nostri test unitari. Controlliamo solo che una determinata operazione faccia chiamare il metodo per produrre un messaggio specifico, ma ci prendiamo in giro perché non pubblichiamo un messaggio. Quindi testiamo ciascuno dei consumatori chiamando esplicitamente i metodi del consumatore con uno specifico messaggio che abbiamo creato.

6

ho sviluppato un wrapper per il processo di download, l'estrazione, l'avvio e la gestione di RabbitMQ modo che possa funzionare come un servizio integrato controllato da qualsiasi progetto JVM .

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

E 'semplice come:

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

Funziona su Linux, Mac e Windows.

+0

Posso confermare che questo funziona! Sto usando questa libreria nel mio Unit Testing (applicazione Spring Bases) per creare un ambiente temporaneo RabbitMq ... – cgval

+2

Funziona bene ma ERL deve essere preinstallato è un problema per me. – deFreitas

10

Una soluzione completamente in-memory. Sostituire le proprietà spring.* come richiesto.

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

Aggiungi initial-config.json come una risorsa:

{ 
    "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

Grazie !!! funziona come un fascino – jamming

+0

Ricorda che se l'applicazione si connette a RabbitMQ in prod, potresti scoprire incongruenze se esegui il bind di Apache QPid per i test di integrazione. RabbitMQ ha ampliato AMQP per fornire funzionalità aggiuntive su cui potrebbe basarsi l'applicazione (ad esempio TTL, DLE/Q, routing, ...). Maggiori informazioni https://www.rabbitmq.com/extensions.html – Alejandro

+0

QPid ha anche la maggior parte di questo, solo con nomi diversi. – OrangeDog