Comment puis-je l'unité de test de code qui appelle le Maillot de l'API Client?
J'ai écrit le code qui appelle le Maillot de l'API client qui appelle à son tour un service web qui est hors de mon contrôle. Je ne veux pas que mon test de l'unité d'appeler le service web réelle.
Quelle est la meilleure approche pour écrire un test unitaire pour le code qui appelle le Maillot de l'API client? Dois-je utiliser le Maillot server API pour écrire un JAX-RS service web, puis utilisez le Maillot Framework de Test pour le test de l'unité? Ou devrais-je se moquer de la Jersey appels de service web? J'ai accès à JMock. Ou devrais-je essayer une autre approche?
Au cours de mes recherches, j'ai trouvé cette discussion décrivant les différentes options, mais j'ai trouvé une solution complète. Existe-il des exemples de code indiquant une suggestion de JUnit approche? Je ne pouvais pas trouver tout dans le Maillot de la documentation.
Voici le code source correspondant:
public String getResult(URI uri) throws Exception {
//error handling code removed for clarity
ClientConfig clientConfig = new DefaultClientConfig();
Client client = Client.create(clientConfig);
WebResource service = client.resource(uri);
String result = service.accept(accept).get(String.class);
return result;
}
Ici sont des exemples de code de test, je voudrais transmettre. Je voudrais tester (1) passant dans une URI valide et d'obtenir une chaîne valide en retour et (2) en le passant dans un invalide (pour quelque raison que ce soit -- inaccessible ou non autorisée) d'URI et d'obtenir une exception en arrière.
@Test
public void testGetResult_ValidUri() throws Exception {
String xml = retriever.getResult(VALID_URI);
Assert.assertFalse(StringUtils.isBlank(xml));
}
@Test(expected = IllegalArgumentException.class)
public void testGetResult_InvalidUri() throws Exception {
retriever.getResult(INVALID_URI);
}
Tout ce qui précède est la simple description de ce que mon code ne. En réalité, il y a une couche sur le dessus de celui qui accepte deux Uri, essaie d'abord d'appeler le premier URI, et si l'URI échoue, alors il essaie de l'appel de la deuxième URI. Je voudrais avoir des tests unitaires de couverture (1) le premier URI réussit, (2) le premier URI échoue et le deuxième URI réussit, et (3) les deux Uri échouer. Ce code est suffisamment complexe pour que j'ai envie de tester ces différents scénarios à l'aide de JUnit, mais pour ce faire j'ai besoin pour exécuter réelle en matière de services web ou pour se moquer de la Jersey client appels d'API.
- Exactement ce que vous souhaitez tester dans cette méthode? Quelles sont les critereas, que le test est passé?
- Eh bien, Si vous voulez faire de test de l'unité, alors vous devez avoir le bon fonctionnelle des services.
- J'ai mis à jour la question que je veux tester (1) passant dans une URI valide et d'obtenir une chaîne valide en retour et (2) en le passant dans un invalide (pour quelque raison que ce soit -- inaccessible ou non autorisée) d'URI et d'obtenir une exception en arrière.
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser Mockito ou Easymock de se moquer des appels de service. Vous devez simuler seulement ces méthodes qui sont réellement utilisées, pas besoin de se moquer de chaque méthode. Vous pouvez créer un objet fantaisie pour WebResource classe, puis se moquer d'accepter l'appel de la méthode.
Dans @BeforeClass/@Avant JUnit test de la méthode d'écrire quelque chose comme (Mockito exemple)
Ensuite dans vos tests, vous pouvez utiliser res objet comme s'il était réel objet et l'appel se moquer de méthode. Au lieu de retourner une valeur, vous pouvez également lancer des exceptions. Mockito est assez cool.
Généralement ce que vous êtes vraiment après est "la façon dont j'utilise le Maillot Client DSL produire une demande pour que l'URL est correcte correcte de la charge utile et les paramètres d'URL". Testée avec Mockito est vraiment détaillé et le code d'installation finissent généralement à la recherche de quelque chose comme ceci:
Et c'est fondamentalement juste pour un seul RESTE de la demande. C'est trop verbeux, et au lieu de tester le résultat espéré vous êtes simplement en reproduisant les étapes que vous pensez sont corrects en utilisant le Maillot Client DSL.
Au lieu de ce qui précède, je voudrais but de se moquer d'un simple service. Pour cela, j'ai utilisé WireMock qui démarre un serveur Jetty et où je peux stub des choses comme "s'attendre à une demande à cette adresse URL, de répondre à ce message et de vérifier que la charge est cette".
Je sais que c'est de bordure sur un test d'intégration et il est un peu plus lent que d'utiliser simplement des Mockito, mais j'ai le test de la valeur du réel résultat et j'apprécie la lisibilité des tests de façon plus dans ce cas.
À l'installation d'une WireMock basée Maillot de test Client ressemble à quelque chose comme ceci:
Mettre en œuvre un travail comme service et dans votre unité de test de démarrage de l'installation, le service à l'aide de HttpServerFactory.