wie zum Hohn spring amqp/Kaninchen im Frühjahr boot-test
Wie mock spring-rabbitmq/amqp so wird es nicht scheitern während eines Spring-Boot-Test beim Versuch das automatische erstellen Umtausch/Warteschlangen?
Gegeben habe ich eine einfache RabbitListener
dazu führen, dass der queue und exchange werden automatisch wie folgt erstellt:
@Component
@RabbitListener(bindings = {
@QueueBinding(
value = @Queue(value = "myqueue", autoDelete = "true"),
exchange = @Exchange(value = "myexchange", autoDelete = "true", type = "direct"),
key = "mykey")}
)
@RabbitListenerCondition
public class EventHandler {
@RabbitHandler
public void onEvent(Event event) {
...
}
}
Während eine einfache Spring-Boot Testen, wie das ist:
@ActiveProfiles("test")
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = { Application.class })
@Autowired
private ApplicationContext applicationContext;
@Test
public void test() {
assertNotNull(applicationContext);
}
}
schlägt es fehl mit:
16:22:16.527 [SimpleAsyncTaskExecutor-1] ERROR o.s.a.r.l.SimpleMessageListenerContainer - Failed to check/redeclare auto-delete queue(s).
org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused
at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:62)
at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:309)
In diesem test I don ' T care über Kaninchen/AMQP, also wie kann ich verspotte die ganzen Kaninchen/AMQP Weg?
InformationsquelleAutor domi | 2016-08-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nicht besonders leicht, wir verwenden in der Regel ein JUnit
@Rule
zu überspringen Sie den test, wenn der Makler nicht zur Verfügung.Aber wir haben eine Menge von tests, die die Verwendung verspottet, aber Sie haben wirklich zu verstehen eine Menge von der Spring AMQP-Interna, um Sie zu benutzen. Erkunden Sie die Testfälle in der Projekt selbst.
An einer Stelle habe ich versucht zu schreiben ein mock-broker, aber es endete als zu viel Arbeit.
Wenn ich richtig bin, bedeutet das auch, dass ich nicht in der Lage zu verwenden SpringBoot Testfälle mit einem vollen container, Wann immer ich eine solche Konfiguration 🙁
Sie verspotten die Vorlage ist einfach genug; es ist die Verspottung broker Antworten (bestätigt, Retouren, Lieferungen), ist viel mehr beteiligt. "Erklären" funktioniert nicht mehr" -
AmqpTemplate
ist eine einfacheinterface
; es gibt nichts in 1.6, die noch geändert hätte, die Fähigkeit zu verspotten. Für@RabbitListener
Sie hätte zu verspotten listener-container.Ich muss nicht alles, was mit Kaninchen/amqp für die Arbeit in diesem testcase, alles was ich will ist, dass der Start nicht ausfallen, mit der oben gezeigten Fehlermeldung.
mit 1.5.6 hatte ich nur zu verspotten, die
AmqpTemplate
und dann hatte ich den embedded tomcat zu starten, ohne Fehlermeldung.InformationsquelleAutor Gary Russell
Ich weiß, das ist ein altes Thema, aber ich möchte zu einem spöttischen Bibliothek, die ich bin, die Dritte : rabbitmq-mock.
Den Zweck dieses mock ist, zu imitieren, RabbitMQ Verhalten nicht IO (ohne einen server startest, hören Sie port, etc.) und mit kleinen (~ keine) startup-Zeit.
Es ist in Maven Central:
Grundlegende Verwendung wird zum überschreiben der Spring-Konfiguration mit einem test :
Für die automatische Spott der Spring-Bean, die für die tests, geben einen Blick auf ein anderes Projekt an dem ich arbeite: Frühling-automocker
Hoffe, dass dies helfen kann !
Die rabbitmq-mock - code nicht mit dieser
com.rabbitmq.client.QueueingConsumer
, welche version von amqp-client verwenden Sie ?4.2.0. Ein weiteres dev implementiert, die es vor etwa einem Jahr. Ich versuche nur, um die tests ausführen, ohne eine Ausnahme zu werfen.
Sie muss etwas schief gehen mit Ihrem dependency management, weil ich nur finden kann spring-rabbit (1.17.10.VERSION) zeigt auf amqp-client (Version 4.0.3) und spring-rabbit (2.0.0.VERSION) zeigt auf amqp-client (5.0.0), keine Verweise auf 4.2.0 version. Außer, dass der Fehler verknüpft ist aufgrund der fehlenden nicht - Klasse
com.rabbitmq.client.QueueingConsumer
, die derzeit in 4.2.0, aber entfernt werden, nachdem 5.0.0. Können Sie den Klassenpfad für unerwünschte version des ampq-client Abhängigkeit ?Ausgezeichnet. Funktioniert einen Charme!! Dank
InformationsquelleAutor Loïc Le Doyen
Nicht sicher, ob das hilfreich ist aber ich hatte das gleiche problem. So, ich habe gerade verwendet
@MockBean
aufRabbitAdmin
mit einem anderen Profil, und ich habe nicht die gleichen Verbindungsprobleme. Tests Bestanden.InformationsquelleAutor Raj
In unserem Projekt initialisieren wir eine
RabbitMQ
Instanz über einedocker
- container vor Ort. Zum ausführen eines integration test, wir tun spin-up eineRabbitMQ
Beispiel am Anfang der Testfall-und heruntergefahren werden während des clean-up.Verwenden wir TestContainers, genau das zu tun. Bitte sehen https://www.testcontainers.org/usage/dockerfile.html und/oder https://www.testcontainers.org/usage/docker_compose.html.
InformationsquelleAutor joy
Ich hatte eine ähnliche Anforderung an einem gewissen Punkt, und blickte in QPid, die eine in-memory-AMQP-broker. Es zwingt Sie zu bleiben, an den AMQP-Ebene, und verwenden Sie so wenig rabbitMq-spezifischen code, wie möglich.
Aber ich fand einen anderen Weg : durch anpassen der Namen der Warteschlangen und Börsen bei der Ausführung von tests + auto-Wert löschen, wir sind nicht mit dem Thema mehr. Alle queue - /exchange-Namen, die in tests als mit den Benutzernamen (der account mit der Ausführung der tests), das heißt, jeder kann die tests ausführen, die auf Ihre Maschine, ohne Auswirkungen auf andere.
Sogar in unsere CI-pipeline, mehrere Projekte können die gleichen Umtausch/Warteschlangen : wir konfigurieren die Werte in tests für sein Projekt spezifisch, so dass selbst wenn 2 Projekte führen Sie Ihre tests in der gleichen Zeit auf dem gleichen Rechner mit dem gleichen Benutzer, Nachrichten werden nicht "Leck" nicht im aktuellen test.
Diese endet als viel einfacher zu verwalten als Spott oder Laich einer in-memory-broker.
InformationsquelleAutor Vincent F