RabbitMQ Integrationstest und Threading

Ich habe einen RabbitMQ-Consumer geschrieben, indem ich die MessageListener-Schnittstelle implementiert und einen SimpleMessageListenerContainer eingerichtet habe. Es funktioniert gut, wenn ich es manuell teste. Jetzt möchte ich einen Integrationstest schreiben, der:

Erstellt eine Nachricht Leitet die Nachricht an meinen RabbitMQ-Server weiterWartet, während die Nachricht von meiner MessageListener-Implementierung verwendet wird Test macht einige Aussagen, sobald alles erledigt ist

Da mein MessageListener jedoch in einem separaten Thread ausgeführt wird, ist das Testen von Einheiten schwierig. Wenn ich in meinem Test einen Thread.sleep verwende, um auf den MessageListener zu warten, ist dies unzuverlässig. Ich benötige eine Art Blockierungsansatz.

Richte eine Antwortwarteschlange ein und verwenderabbitTemplate.convertSendAndReceive meine einzige Option? Ich wollte das Einrichten von Antwortwarteschlangen vermeiden, da diese im realen System nicht verwendet werden.

ibt es eine Möglichkeit, dies nur mit @ zu erreicherabbitTemplate.convertAndSend und dann irgendwie darauf warten, dass mein MessageListener die Nachricht empfängt und verarbeitet? Idealerweise würde ich mir so etwas vorstellen:

rabbitTemplate.convertAndSend("routing.key", testObject);
waitForListner() // Somehow wait for my MessageListener consume the message
assertTrue(...)
assertTrue(...)

Ich weiß, ich könnte einfach eine Nachricht direkt an meinen MessageListener weiterleiten, ohne mich mit RabbitMQ zu verbinden, aber ich hatte gehofft, das gesamte System zu testen, wenn dies möglich ist. Ich plane, auf diese Lösung zurückzugreifen, wenn es keine Möglichkeit gibt, mein Ziel auf einigermaßen saubere Weise zu erreichen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage