# MockServer

MockServer est un framework open source de mocks pour HTTP et HTTPS publié sous la licence Apache. MockServer est conçu pour simplifier les tests d'intégration, en « mockant » un système HTTP et HTTPS tel qu'une API ou un site web, et pour dissocier les équipes de développement, en permettant à une équipe de se développer sur un service incomplet ou instable.

## Description

MockServer simplifie les tests automatisés et promeut les meilleures pratiques en améliorant l'isolation du système testé, en simplifiant les scénarios de test et en améliorant l'encapsulation et la séparation des problèmes dans les tests, comme suit : la simulation des systèmes dépendants est un mécanisme efficace pour isoler le système testé afin de garantir que les tests s'exécutent de manière fiable et n'échouent qu'en cas d'erreur réelle, cela évite l'échec des tests en raison de modifications externes non pertinentes telles qu'une panne de réseau ou un serveur redémarré / redéployé. Outre le test d'isolement, le système dépendant mocké permet également de tester les différentes réponses et scénarios sans avoir à configurer et à gérer une infrastructure de test complexe. Par exemple, un délai de réponse accru ou des connexions interrompues peuvent augmenter à mesure que la charge augmente sur un système dépendant. Il peut être extrêmement difficile de simuler ces types de dégradation liée aux performances sans générer un grand volume de trafic. Si le système dépendant est simulé, le mock peut contrôler le délai de réponse exact ou toute autre caractéristique de chaque réponse.
Un anti-modèle courant pour les tests automatisés consiste à enregistrer et à rejouer les réponses de service dépendantes réelles. Ces enregistrements sont généralement complexes et partagés entre plusieurs tests. Cela introduit cependant un couplage inutile entre les tests et rompt le principe de responsabilité unique, qui stipule que chaque contexte (classe, fonction, variable, etc.) doit définir une responsabilité unique, et que la responsabilité doit être entièrement encapsulée par le contexte. Les solutions d'enregistrement et de relecture s'effondrent également lorsque la réponse change. Par exemple, si un service de librairie est mocké en enregistrant une réponse contenant une liste de 50 livres, lorsque le format d'un livre change, la réponse enregistrée doit être mise à jour à 50 endroits. Si une nouvelle réponse est enregistrée avec le nouveau format, les assertions de test devront très probablement être mises à jour. De plus, les approches d'enregistrement et de relecture masquent les données utilisées dans le test du code de test et rompent donc l'encapsulation et la séparation des préoccupations. MockServer simplifie la simulation des réponses pour les systèmes dépendants en fournissant une API simple et un client en plusieurs langues. Chaque test peut ensuite encapsuler indépendamment les données et la logique utilisées pour les services fictifs, garantissant ainsi que chaque test s'exécute indépendamment. En outre, une telle approche réduit également le temps d'exécution d'une suite de tests, car les tests peuvent s'exécuter en parallèle et ne partagent pas de données.

## Découplage des équipes de développement

MockServer rend les équipes de développement indépendantes, en permettant à une équipe de développer en se basant sur un service incomplet ou instable :
* Si une API ou un service n'est pas encore entièrement développé, MockServer peut être utilisé pour mocké l'API permettant à toute équipe qui utilise le service de commencer à travailler sans être retardée. Mocker une API ou d'un service pendant le développement d'une application peut souvent augmenter le coût de l'intégration, car plus le délai avant l'intégration complète des systèmes est long, plus il peut être coûteux de refactoriser ou d'annuler des décisions de conception incorrectes en empêchant l'intégration. Cependant, deux systèmes qui s'intègrent doivent souvent être construits en parallèle en raison de contraintes financières ou de temps. Si une application est construite sur une interface instable et peu fiable, cela peut entraîner le blocage fréquent du développement et des tests. Mocker l'interface instable peut fournir plus de contrôle sur le moment et la manière dont l'intégration est effectuée afin de réduire les perturbations et les coûts globaux.
* Mocker un service permet également aux équipes de développement de s'isoler d'un service web instable, peu fiable ou volatile. Ceci est particulièrement critique lors des phases de développement initiales lorsque les API/services changent fréquemment et bloquent le développement et les tests.

## Fonctionnalités

Les principales fonctionnalités prises en charge sont :
* Renvoyer une réponse spécifique lorsqu'une requête correspondant à une attente a été reçue
* Renvoyer dynamiquement une réponse lorsqu'une requête correspondant à une attente a été reçue
* Exécuter une fonction (en Java) lorsqu'une requête correspondant à un mock a été reçue
* Vérifier qu'une demande a été envoyée un certain nombre de fois
* Vérifier qu'une séquence de requêtes a été envoyée dans un ordre spécifique
* Enregistrer les requêtes et les réponses pour analyser comment un système interagit avec les dépendances externes

## Technologie

MockServer est développé en utilisant Netty et est écrit en Java. Il s'exécute en tant que serveur intégré sur un thread séparé ou en tant que machine virtuelle Java autonome. MockServer peut être utilisé de plusieurs façons :
* Via un plugin Apache Maven dans le cadre d'un cycle de construction Apache Maven
* Par programmation via une API dans une méthode @Before ou @After dans un test JUnit ou TestNG
* En utilisant une JUnit @Rule via un champ annoté @Rule dans un test JUnit
* Depuis la ligne de commande en tant que processus autonome dans un environnement de test
* En tant que conteneur Docker dans n'importe quel environnement compatible Docker
* En tant que module Vert.x dans le cadre d'un environnement Vert.x existant
* En tant que WAR déployable sur un serveur Web existant
* En tant que plugin grunt.js dans le cadre d'un cycle de construction grunt.js
* En tant que module Node.js (npm) à partir de n'importe quel code Node.js.
* Comme contexte PHP Behat (computer_science) pour les tests fonctionnels
MockServer est disponible en tant que :
* Serveur Web Netty autonome containerisé
* WAR déployable qui s'exécute sur n'importe quel serveur web Java Enterprise Edition
* Conteneur Docker entièrement containerisé
* Module Vert.x qui s'exécute sur un Vert.x