Comment utiliser mockito pour tester un service REST?
Je suis très nouveau dans Java de Tests Unitaires et j'ai entendu dire que Mockito cadre est vraiment bon pour des fins de test.
J'ai développé un REPOS Serveur (méthodes CRUD) et maintenant je veux le tester, mais je ne sais pas comment?
Même plus je ne sais pas comment cette procédure d'essai doit commencer. Mon serveur doit travailler sur localhost et puis faire des appels sur cette url(par exemple: localhost:8888)?
Voici ce que j'ai essayé jusqu'à présent, mais je suis assez sûr que ce n'est pas de la bonne façon.
@Test
public void testInitialize() {
RESTfulGeneric rest = mock(RESTfulGeneric.class);
ResponseBuilder builder = Response.status(Response.Status.OK);
builder = Response.status(Response.Status.OK).entity(
"Your schema was succesfully created!");
when(rest.initialize(DatabaseSchema)).thenReturn(builder.build());
String result = rest.initialize(DatabaseSchema).getEntity().toString();
System.out.println("Here: " + result);
assertEquals("Your schema was succesfully created!", result);
}
Voici le code pour initialize
méthode.
@POST
@Produces(MediaType.APPLICATION_JSON)
@Path("/initialize")
public Response initialize(String DatabaseSchema) {
/** Set the LogLevel to Info, severe, warning and info will be written */
LOGGER.setLevel(Level.INFO);
ResponseBuilder builder = Response.status(Response.Status.OK);
LOGGER.info("POST/initialize - Initialize the " + user.getUserEmail()
+ " namespace with a database schema.");
/** Get a handle on the datastore itself */
DatastoreService datastore = DatastoreServiceFactory
.getDatastoreService();
datastore.put(dbSchema);
builder = Response.status(Response.Status.OK).entity(
"Your schema was succesfully created!");
/** Send response */
return builder.build();
}
Dans ce cas de test je veux envoyer une chaîne Json pour le serveur(POST). Si tout s'est bien passé puis le serveur doit répondre avec "Votre schéma a été créé avec succès!".
Quelqu'un peut-il m'aider?
- Où dans le code ci-dessus ne vous envoyer une chaîne JSON pour le serveur? Pourquoi avez-vous encore besoin de Mockito pour de tels tests?
- Je ne sais pas si j'ai besoin de Mockito pour ce genre de tests, comme je l'ai dit je m en essayant de comprendre comment tester un service REST. Le fichier JSON est l'envoi quand je suis à l'appel de cette méthode :
rest.initialize(DatabaseSchema)
,DatabaseSchema
est un fichier JSON. - Non, il n'est pas.
rest
est un simulacre. C'est un objet qui répond à ce que vous lui dites de réponse. Ce n'est pas de votre serveur. Vous faites des tests Mockito au lieu de tester votre serveur. Vous n'avez pas besoin de Mockito pour de tels tests. - Merci!!!! Pouvez-vous svp me guider, comment dois-je faire? Je veux tester mes méthodes CRUD. Je veux des tests unitaires, de tester le reste de la méthode sur mon serveur.
- Soit tu fais des tests d'intégration et envoyer JSON de votre serveur et d'analyser la réponse que vous obtenez pour s'assurer qu'ils sont appropriés, ou vous faire des tests unitaires pour tester des méthodes de classes utilisé côté serveur. Mockito peut être utile pour les seconds. Mais sans voir le code, il est impossible de vous dire comment le tester, autres que de pointer du doigt vous à la documentation de Mockito.
- Lorsque vous m'avez dit de faire des tests d'intégration et d'envoyer JSON à un serveur, vous avez voulu utiliser
HttpClient
et fait envoyer une requête à l'API du serveur url? Mais ce genre de tests ne sont pas des tests unitaires, parce que je suis en train de tester des méthodes individuelles! Je pense que je suis confus ou il n'est pas clair pour moi. - Oui, c'est ce que je voulais dire avec les tests d'intégration. C'est aussi ce que vous avez demandé: Dans ce cas de test je veux envoyer une chaîne Json pour le serveur(POST). Si vous voulez tester une méthode d'un objet, alors tout va bien, mais ce n'est pas ce que vous avez demandé. Et sans savoir ce que cette méthode est censé faire, quel est son nom, des arguments et des dépendances, il n'est pas possible pour les aider.
- Tout d'abord merci beaucoup pour m'aider. Dans ce cas, la méthode
initialize
sur le côté serveur, de recevoir un fichier JSON comme ceci:{"kind":"Note", "property":["id","name","note","date"]}
et puis, après l'analyse du JSON et extraction des propriétés crée une base de données avec ce schéma, oùkind
est le nom de la DB etproperties
sont les champs(colonnes). J'ai mis à jour la question avec le code de cette méthode. Puis, après l'initialisation je veux tester l'Ajouter, mettre à Jour, Supprimer, la méthode Get. - Je veux suggérer WireMock. C'est une bibliothèque pour cogner et se moquant de services web. wiremock.org/index.html
Vous devez vous connecter pour publier un commentaire.
OK. Ainsi, le contrat de la méthode est le suivant: Analyser la chaîne d'entrée en JSON, et l'envoi de
BAD_REQUEST
si elle est invalide. Si c'est valide, créer une entité dans ledatastore
avec des propriétés différentes (vous les connaissez), et renvoyer lesOK
.Et vous avez besoin de vérifier que le contrat est rempli par la méthode.
Où Mockito de l'aide ici? Eh bien, si vous testez cette méthode sans Mockito, vous avez besoin d'un réel
DataStoreService
, et vous devez vérifier que l'entité a été créée correctement dans cette véritableDataStoreService
. C'est là que votre test n'est pas une unité de test plus, et c'est aussi là que c'est trop complexe pour tester, trop long et trop dur à gérer, car il a besoin d'un environnement complexe.Mockito pouvez nous aider en se moquant de la dépendance sur la
DataStoreService
: vous pouvez créer une maquette deDataStoreService
, et de vérifier que cette maquette est en effet appelé à l'entité appropriée argument lorsque vous appelez votreinitialize()
méthode dans votre test.Pour ce faire, vous devez être en mesure d'injecter le
DataStoreService
dans votre objet sous test. Il peut être aussi facile que la refactorisation de votre objet de la manière suivante:Et maintenant dans votre méthode de test, vous pouvez faire:
verify(mockDataStoreService).put(argument.capture());
? Même si il a fait après j'ai changé demockDataStoreService
j'obtiens une erreurThe method verify(DatastoreService) is undefined for the type MyRestService
.import static org.mockito.Mockito.*
. vérifier, c'est une méthode statique de la Mockito classe.De quoi vous parlez ressemble plus à les tests d'intégration et Mockito (ou tout autre moqueur cadres) ne seront pas d'une grande aide pour vous.
Si vous voulez de l'unité de test de code que vous avez écrit, Mockito est certainement un outil utile.
Je vous suggère de lire plus au sujet de moqueries/tests unitaires et de quelles circonstances il devrait être utilisé.
Mockito est (généralement) pour les tests portions de code; par exemple si vous souhaitez utiliser votre service de REPOS, mais ne veulent pas faire un full-stack de test, vous me moquer de la service de qui est connecté au RESTE du service, vous permettant précisément, et de façon constante, test de comportement spécifique.
De test interne des parties du RESTE du service (par exemple, un service spécifique de la méthode), sans frapper une base de données, vous me moquer de la DB sous-système, permettant de test de service internes uniquement, sans participation de la DB. Ce test appartient dans le RESTE module de service, et non du côté client.
Pour tester le RESTE du service que vous souhaitez utiliser un client actuel de la bibliothèque, la création d'une pile de test d'intégration. Mockito pourrait être utilisé ici pour se moquer de portions du client sans rapport avec le REPOS, la consommation de services.
Meilleure méthode est d'utiliser wiremock Ajouter les dépendances suivantes com.github.tomakehurst wiremock 2.4.1 org.igniterealtime.smack smack-core 4.0.6
Définir et utiliser la wiremock comme indiqué ci-dessous
Je suis d'accord ce n'est pas l'unité de test, mais test d'intégration, de toute façon vous préférez prendre un coup d'oeil sur le jersey et intégré grizzly serveur de tests. Pour summ vers le haut, ce code commence le grizzly serveur (qui pourrait commencer à la datbase ainsi) à localhost:8888, puis le programme d'installation du client jersey client et envoyé un POST de demande d'intervention doit être testé. C'est une intégration puisque vous êtes les tests à la fois de serveur et de base de données, vous pouvez utiliser mockito pour émuler la base de données, cependant, mais cela dépend de comment lié à votre serveur de base de données et sont.
(test à l'aide de jersey 1.11 et grizzly 2.2)