2015-06-18 26 views
9

Próbuję utworzyć test integracji dla aplikacji Scala/Java, która łączy się z brokerem RabbitMQ. Aby to osiągnąć, chciałbym mieć wbudowany broker, który mówi AMQP, że zaczynam i kończę przed każdym testem. Pierwotnie próbowałem wprowadzić ActiveMQ jako wbudowany broker z AMQP, jednak aplikacja używa RabbitMQ, więc mówi tylko AMQP w wersji 0.9.3, podczas gdy ActiveMQ wymaga AMQP w wersji 1.0.Wbudowany broker Java AMQP

Czy istnieje inny osadzony broker, którego mogę użyć zamiast ActiveMQ?

+1

RabbitMQ realizuje AMQP 0,8; 0.9.1 i AMQP 1.0. Jeśli korzystasz z mac, dość łatwo jest uruchomić/zatrzymać rabbitmq do swoich testów. To jest dla PHP, ale może ci pomóc w przypadku użycia http://videlalvaro.github.io/2013/04/using-rabbitmq-in-unit-tests.html –

+0

Witam @old_sound, dziękuję za zaglądanie w to. Idealnie chciałbym uniknąć konieczności sprawdzania rabbitmq na pudełku, nasze testy działają na serwerze CI, który nie jest w stanie łatwo zainstalować RabbitMQ. – ahjmorton

+0

Czy ten serwer CI ma co najmniej zainstalowany Erlang?Jeśli tak, możesz po prostu pobrać archiwum królików, rozpakować je i uruchomić/zatrzymać dla testów. –

Odpowiedz

3

nie jestem świadomy żadnej wbudowanymi serwerami RabbitMQ więc myślę, że masz kilka opcji, aby obejść to:

  1. Serwer RabbitMQ nie musi istnieć na serwerze CI, można przywołać nowy serwer, który jest serwerem CI rabbitmq. Jeśli nie możesz samemu przywołać, możesz zajrzeć do CloudAMQP. Obecnie warstwa bezpłatna oferuje: 1 mln wiadomości miesięcznie, 20 równoczesnych połączeń, 100 kolejek, 10.000 oczekujących wiadomości. Może wystarczyć dla twojego procesu CI.

  2. Jeśli twoje testy są wykonywane tylko testy jednostkowe dla RabbitMQ, możesz wyłudzić swoją produkcję wiadomości RabbitMQ. Oto, co robimy w niektórych naszych testach jednostkowych. Po prostu sprawdzamy, czy dana operacja powoduje wywołanie metody w celu wygenerowania konkretnej wiadomości, ale wyśmiewamy ją, abyśmy nie publikowali wiadomości. Następnie testujemy każdego z klientów, wywołując jawnie metody konsumenckie z konkretną wiadomością, którą stworzyliśmy.

6

Mam opracowaną owijkę wokół proces pobierania, wyodrębnianie, uruchamiania i zarządzania RabbitMQ więc może pracować jak osadzonym usługi kontrolowane przez każdego projektu JVM .

Sprawdź: https://github.com/AlejandroRivera/embedded-rabbitmq

Jest to tak proste, jak:

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

Działa na Linux, Mac i Windows.

+0

Mogę potwierdzić, że to działa! Używam tej biblioteki w mojej jednostce testowania (aplikacja bazowa Spring) do utworzenia tymczasowego środowiska RabbitMq ... – cgval

+2

Działa świetnie, ale ERL musi być wstępnie zainstalowany jest problemem dla mnie. – deFreitas

10

Rozwiązanie całkowicie w pamięci. Zastąp właściwości spring.* zgodnie z wymaganiami.

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

Dodaj initial-config.json jako źródło:

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

Dziękujemy! działa jak czar – jamming

+0

Pamiętaj, że jeśli twoja aplikacja łączy się z RabbitMQ w prod, możesz odkryć niespójności, jeśli podłączysz Apache QPid do testów integracyjnych. RabbitMQ rozszerzyło AMQP, aby zapewnić dodatkowe funkcje, na które może polegać Twoja aplikacja (np. TTL, DLE/Qs, routing, ...). Więcej informacji https://www.rabbitmq.com/extensions.html – Alejandro

+0

QPid ma większość z nich, tylko z różnymi nazwami. – OrangeDog