2016-10-15 1 views
1

Je veux écrire des tests fonctionnels pour mon application Codename One. Pour ce faire, je dois être en mesure de se moquer de certaines réponses du serveur, afin qu'elles retournent exactement ce dont j'ai besoin pour le test spécifique. Une chose que j'ai essayé de rendre les fonctions qui envoient les requêtes HTTP prend ConnectionRequest en paramètre, de cette façon je peux injecter quelque chose pour simuler la latence du réseau et ensuite appeler le rappel avec la réponse mockée.Comment se moquer des requêtes serveur/http dans Codename One pour tester?

Cependant, lorsque j'essaie d'injecter les mocks de ConnectionRequest dans la méthode de préparation d'un test unitaire, ils sont toujours injectés après le démarrage de l'application, ce qui ne fonctionne pas pour mon cas puisque j'ai envoyé une requête HTTP de l'application.

Est-il possible de se moquer de ConnectionRequest ou de faire quelque chose d'équivalent avant de démarrer l'application?

+0

Nous n'avons rien de pareil dans Codename One. Vous pourriez peut-être pirater certains frameworks JavaSE pour travailler avec le simulateur. –

Répondre

0

Voici ce que j'ai fini par faire. Je poste ceci si quelqu'un a besoin d'une solution de contournement pour les tests automatisés.

  1. Ecrire une interface appelée HTTPRequestInterface, qui expose les méthodes neccessary pour construire une requête HTTP
  2. Créer une implémentation de HTTPRequestInterface appelé dire HTTPRequest, qui est juste une enveloppe autour ConnectionRequest
  3. Créer une classe pour créer HTTPRequests , disons HTTPRequestFactory, qui a une méthode statique appelée create et une méthode appelée setMock. Cette classe crée un HTTPRequest normal dans le cas où aucun simulacre n'a été défini et le simulacre spécifié dans le cas où un simulacre a été défini.
  4. Remplacer tous ConnectionRequest avec HTTPRequestFactory.create()
  5. Créer une classe InitialSetup, qui dispose de deux méthodes: setInitialization, qui accepte un Runnable à exécuter, et la méthode init qui passe juste la Runnable.
  6. Dans la méthode de démarrage, appel InitialSetup.init
  7. Maintenant dans les tests, dans la méthode de préparation, je peux définir le simulacre désiré, et l'application lors de l'exécution des tests automatisés enverra des requêtes au serveur réel.

Nécessite un peu d'effort, mais les tests automatisés avec backend moqué apportent la confiance que je pense en vaut vraiment la peine!

1

Vous pouvez ralentir la connectivité dans le simulateur qui se moqueront connexion lente sur les appareils ou désactiver complètement pour simuler Aucune connexion Internet. Trouvez les options dans votre simulateur sous Simuler ->Réseau. Modifiez ce paramètre à Slow connection ou Disconnected et réexécutez votre application.

Pointez vers une adresse URL incorrecte pour simuler une erreur 404.

Renvoyez des données illisibles à partir du code côté serveur pour simuler une exception IOException ou NullPointer. Tout en effectuant cela, assurez-vous que votre Moniteur réseau est visible. La plupart des autres réponses que vous voulez pourraient être faites sur votre serveur.

+0

Merci pour la réponse! Mais la chose que je veux dans ce cas est par exemple, un point de terminaison de serveur peut retourner deux réponses possibles, et je veux tester que l'application agit de manière appropriée pour chacun. Puisque les tests fonctionnels sont automatisés, je ne peux pas coder en dur la réponse dans le serveur. Je cherche quelque chose comme https://docs.angularjs.org/api/ngMock/service/$httpBackend dans Angular, fondamentalement vous dites: "Pour ce test automatisé, attendez cette requête HTTP, et répondez avec cette réponse HTTP" . Après quelques recherches, je pense que ce n'est pas possible dans Codename One. –