comment se moquer de printemps amqp/lapin au printemps de démarrage de test
La façon de se moquer de printemps rabbitmq/amqp, de sorte qu'il ne manquera pas au cours d'un Printemps de Démarrage de Test, tout en essayant de créer automatiquement des échanges/les files d'attente?
Donné que j'ai un simple RabbitListener
qui sera la cause de la file d'attente et l'échange automatique créé comme ceci:
@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) {
...
}
}
Au cours d'un Printemps simple Test au Démarrage, comme ceci:
@ActiveProfiles("test")
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = { Application.class })
@Autowired
private ApplicationContext applicationContext;
@Test
public void test() {
assertNotNull(applicationContext);
}
}
il échouera avec:
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)
Dans ce test, je ne se soucient pas de Lapin/AMQP, alors comment puis-je simuler le Lapin entier/AMQP loin?
OriginalL'auteur domi | 2016-08-03
Vous devez vous connecter pour publier un commentaire.
Il n'est pas particulièrement facile, nous utilisons généralement un JUnit
@Rule
de sauter le test si le courtier n'est pas disponible.Toutefois, nous disposons d'un grand nombre de tests qui utilisent des objets fantaisie, mais vous avez vraiment besoin de comprendre beaucoup de le Printemps AMQP internes pour les utiliser. Vous pouvez explorer les cas de test dans le projet lui-même.
À un point que je n'tentative d'écriture d'un simulacre de courtier, mais il a fini par être trop de travail.
Si je suis correct, cela signifie aussi que je ne vais pas être en mesure d'utiliser tout SpringBoot cas de Test avec un conteneur plein si jamais j'ai une telle configuration 🙁
Moqueur, le modèle est assez facile, c'est se moquant de courtier réponses (confirme, les retours, les livraisons) c'est beaucoup plus impliqués. Expliquer "ne fonctionne plus" -
AmqpTemplate
est un simpleinterface
; il n'y a rien de 1,6 cela aurait changé la possibilité de s'en moquer. Pour@RabbitListener
vous aurait à se moquer de l'auditeur conteneur.Je n'ai pas besoin de tout ce qui est lié à lapin/amqp de travail dans ce cas de test, tout ce que je veux, c'est que le démarrage de ne pas échouer avec le ci-dessus montre l'erreur.
avec 1.5.6 je n'ai eu qu'à se moquer de la
AmqpTemplate
et puis j'ai eu le tomcat intégré à un démarrage sans erreur.OriginalL'auteur Gary Russell
Je sais que c'est un vieux sujet, mais je voudrais introduire un moqueur à la bibliothèque, je vais développer : rabbitmq-maquette.
Le but de cette maquette est d'imiter RabbitMQ comportement sans IO (sans démarrer un serveur, l'écoute de certains de port, etc.) et avec de faibles (~ aucune) temps de démarrage.
Il est disponible dans Maven Central:
Utilisation de base sera de remplacer le Printemps avec une configuration de test :
Automatique se moquant de Printemps de haricots pour les tests, donner un coup d'oeil à un autre projet, je suis en train de travailler sur: printemps-automocker
Espère que cela peut vous aider !
Le rabbitmq-maquette de code n'utilise pas cette
com.rabbitmq.client.QueueingConsumer
, quelle est la version de amqp-client utilisez-vous ?4.2.0. Un autre dev mise en œuvre, il ya environ un an. Je suis juste essayer d'obtenir les tests à exécuter, sans exception lancer.
vous devez avoir quelque chose de mal avec votre gestion de la dépendance, parce que je ne peux trouver printemps-lapin (1.17.10.La LIBÉRATION) pointant vers amqp-client (4.0.3) et printemps-lapin (2.0.0.La LIBÉRATION) pointant vers amqp-client (5.0.0), pas de références à la version 4.2.0. En outre, l'erreur liée est en raison de l'absence de deprecated classe
com.rabbitmq.client.QueueingConsumer
, qui est présent dans 4.2.0, mais les enlever après 5.0.0. Pouvez-vous vérifier votre classpath pour la version indésirable de la toujours déléguée-client de la dépendance ?Excellent. Fonctionne à merveille!! Merci
OriginalL'auteur Loïc Le Doyen
Ne sais pas si c'est utile, mais, j'ai eu le même problème. Donc, j'ai simplement utilisé
@MockBean
surRabbitAdmin
avec un profil différent, et je n'ai pas les mêmes problèmes de connexion. Les Tests Passés.OriginalL'auteur Raj
Dans notre projet, nous initialisons un
RabbitMQ
exemple à l'aide d'undocker
conteneur localement. Pour exécuter un test d'intégration, nous faisons tourner uneRabbitMQ
exemple, au début de l'essai et de l'arrêter au cours du nettoyage.Nous utilisons TestContainers de le faire. Veuillez voir https://www.testcontainers.org/usage/dockerfile.html et/ou https://www.testcontainers.org/usage/docker_compose.html.
OriginalL'auteur joy
J'ai eu une demande similaire à un certain point, et le regarda dans les QPid, qui fournit une mémoire courtier AMQP. C'est de vous forcer à rester à la AMQP niveau, et l'utiliser comme peu de rabbitMq code spécifique que possible.
Mais j'ai en fait trouvé une autre façon : en jouant sur les noms des files d'attente et les échanges lors de l'exécution de tests + l'auto-suppression de la valeur, nous ne parlons pas de la question plus. Tous file d'attente/d'échange de noms dans les tests sont suffixé par le nom d'utilisateur du compte qui exécute les tests), ce qui signifie que tout le monde peut exécuter les tests sur leur machine sans impact sur les autres.
Même dans notre CI pipeline, plusieurs projets peuvent utiliser les mêmes échanges/les files d'attente : nous allons configurer les valeurs des tests pour être spécifique au projet, de sorte que même si les 2 projets exécuter leurs tests en même temps sur la même machine avec le même utilisateur, les messages ne sont pas de "fuite" à l'extérieur de test en cours.
Cela finit par être beaucoup plus simple à gérer que de moquer ou de frai d'une mémoire d'un courtier.
OriginalL'auteur Vincent F