Comment se moquer de distance API REST dans l'unité de test avec le Printemps?
Assumer, j'ai fait un simple client dans mon application qui utilise un service web distant qui est d'exposer une API RESTful à un URI /foo/bar/{baz}
. Maintenant, je souhaite l'unité de test de mon client qui effectue des appels de ce service web.
Idéalement, dans mes tests, j'aimerais en dérision les réponses que je reçois à partir du service web, compte tenu d'une demande spécifique, comme /foo/bar/123
ou /foo/bar/42
. Mon client assume l'API est en train de tourner quelque part, j'ai donc besoin d'un local "web service" pour commencer à fonctionner sur http://localhost:9090/foo/bar
pour mes tests.
Je veux que mes tests unitaires pour être autonome, semblable à des tests de Printemps contrôleurs avec le Spring MVC framework de Test.
Certains pseudo-code pour un simple client, de récupérer les numéros à partir de l'API à distance:
//Initialization logic involving setting up mocking of remote API at
//http://localhost:9090/foo/bar
@Autowired
NumberClient numberClient //calls the API at http://localhost:9090/foo/bar
@Test
public void getNumber42() {
onRequest(mockAPI.get("/foo/bar/42")).thenRespond("{ \"number\" : 42 }");
assertEquals(42, numberClient.getNumber(42));
}
//..
Quelles sont mes solutions de rechange à l'aide de Printemps?
Voulez-vous dire si j'ai marshall et de JSON dans le domaine des objets dans mon client?
Plus précisément, si vous maréchal/unmarshal intermédiaire des objets représentant votre domaine entités dans le réseau
Non, je n'ai pas des objets intermédiaires, seuls les objets du domaine et JSON texte.
Alors je vous recommande de commencer à utiliser le pattern DTO et procéder de la même manière que pour le test des contrôleurs MVC.
OriginalL'auteur | 2014-08-29
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez Printemps RestTemplate vous pouvez utiliser MockRestServiceServer. Un exemple peut être trouvé ici https://objectpartners.com/2013/01/09/rest-client-testing-with-mockrestserviceserver/
OriginalL'auteur Tuno
Si vous voulez unité test de votre client, vous devez alors se moquer de l'offre de services que sont le RESTE des appels d'API, c'est à dire avec mockito - je suppose que vous avez un service qui procède à des appels de l'API pour vous, non?
En revanche, si vous voulez "se moquer de" l'Api rest en ce qu'il est une sorte de serveur de vous donner des réponses, ce qui serait plus en phase de tests d'intégration, vous pouvez essayer l'un des nombreux framework comme restito, reste-pilote ou betamax.
OriginalL'auteur theadam
Meilleure méthode est d'utiliser WireMock.
Ajouter les dépendances suivantes:
Définir et utiliser la wiremock comme indiqué ci-dessous
Où est aResponse() en venir?
WireMock.aResponse()
OriginalL'auteur Yallaling Goudar
Ce que vous êtes à la recherche pour la prise en charge de Côté Client Tests de REPOS dans le Spring MVC Framework de Test.
En supposant que votre
NumberClient
utilise du PrintempsRestTemplate
, précité soutien est le chemin à parcourir!Espère que cette aide,
Sam
OriginalL'auteur Sam Brannen
Vous pouvez facilement utiliser Mockito de se moquer d'une API REST en Printemps de Démarrage.
Mettre un écrasé de contrôleur dans votre test de l'arbre:
Votre client devra appeler l'API sur localhost lors de l'exécution des tests. Cela pourrait être configurés dans
src/test/resources/application.properties
. Si le test est à l'aide deRANDOM_PORT
, votre client en vertu de test aura besoin de trouver cette valeur. C'est un peu délicat, mais le problème est abordé ici: Spring Boot - Comment faire pour obtenir l'exécution de portConfigurer votre classe de test à utiliser un
WebEnvironment
(un serveur en cours d'exécution) et maintenant votre test peut utiliser Mockito de la manière standard, le retourResponseEntity
objets nécessaires:Vous pouvez également utiliser cette fonction pour la fin à la fin de l'essai de l'ensemble de votre microservice dans un environnement avec de la maquette créée ci-dessus. Une façon de le faire est d'injecter de
TestRestTemplate
dans votre classe de test, et l'utiliser pour appeler votre API REST en place declientFunctionUnderTest
de l'exemple.Comment cela fonctionne
Parce que
OtherApiHooks
est un@RestController
dans le test de l'arbre, Printemps de Démarrage d'établir automatiquement le service REST spécifié lors de l'exécution de laSpringBootTest.WebEnvironment
.Mockito est utilisé ici pour se moquer de la classe de contrôleur -- pas l'ensemble du service. Par conséquent, il y aura un traitement côté serveur géré par le Printemps de Démarrage avant de la maquette est touché. Cela peut inclure des choses telles que la désérialisation (et valider) le chemin de l'UUID montré dans l'exemple.
De ce que je peux dire, cette approche est robuste pour le test en parallèle fonctionne avec IntelliJ et Maven.
assert
peut-être hors de la faveur avec certains examinateurs.OriginalL'auteur nobar
Si vous utilisez de repos et de tirer parti de la Pattern DTO, alors je vous recommande de suivre ce tutoriel.
OriginalL'auteur Manu
Voici un exemple de base sur la façon de se moquer d'un Contrôleur de classe avec Mockito:
De la classe de Contrôleur:
Configurer les haricots:
La
UserCollectionItemDto
est un simple POJO et il représente ce que l'API consommateur envoie au serveur. Le UserProfile est l'objet principal utilisé dans la couche de service (par leUserService
classe). Ce comportement met également en œuvre la Pattern DTO.Enfin, maquette le comportement attendu:
L'idée est d'utiliser la pure Contrôleur de haricot et de la maquette de ses membres. Dans cet exemple, nous avons réalisé la maquette de la
UserService.getUsers()
objet doit contenir un utilisateur, puis validé si le Contrôleur renvoie le nombre d'utilisateurs.Avec la même logique, vous pouvez tester le Service et d'autres niveaux de votre application. Cet exemple utilise la Contrôleur De Service-Modèle De Référentiel ainsi 🙂
OriginalL'auteur Menelaos Kotsollaris