Se moquant d'un URL dans Java
Nous avons un objet d'URL dans l'une de nos classes Java que nous voulons pour s'en moquer, mais c'est une classe finale donc on ne peut pas. Nous ne voulons pas aller un niveau au-dessus, et se moquer de l'InputStream parce que cela va encore nous laisser avec le code non testé (nous avons draconienne de la couverture de test des normes).
J'ai essayé jMockIt réfléchissant pouvoirs mais nous travailler sur le Mac et il y a des problèmes avec Java agent gestionnaire que je n'ai pas été en mesure de résoudre.
Donc, existe-il des solutions qui n'impliquent pas l'utilisation réelle des Url dans le test junit?
- (java.net.URI est préféré au cours de l'URL.)
- Tom Hawtin: d'accord, j'ai marqué vers le bas pour en supposant que l'URL de l'instance était de coutume de mise en œuvre. Merci d'être plus explicite la prochaine fois - java.net.L'URL est assez facile à écrire.
Vous devez vous connecter pour publier un commentaire.
Quand j'ai une classe qui ne peut pas facilement être moqué parce qu'il est définitif (ou scellé en C#), mon parcours habituel est d'écrire un wrapper autour de la classe et utiliser le wrapper où je voudrais utiliser la classe réelle. Alors, je l'aurais se moquer de la classe wrapper comme nécessaire.
Comme Rob a dit, si ce que vous voulez est pour se moquer de la connexion retourné à partir de l'URL, vous pouvez étendre
URLStreamHandler
. Par exemple, avec mockito:Je suis allé avec les éléments suivants:
Cela me donne une URL réelle de l'objet qui contient ma maquette de données.
J'ai utilisé un URLHandler qui me permet de charger une URL dans le classpath. Donc la suite
serait d'ouvrir un fichier nommé foo de dans le chemin de classe. Pour ce faire, j'utilise un d'utilité commune de la bibliothèque et enregistrer un gestionnaire. Pour utiliser ce gestionnaire, vous avez juste besoin d'appeler:
et l'URL de ressource est maintenant disponible.
Si vous ne voulez pas créer un wrapper :
Enregistrer un URLStreamHandlerFactory
Faire la méthode que vous souhaitez publique
Se moquer de la chaîne
PS : je ne sais pas comment faire pour annuler la numérotation de la liste d'auto-espacement après la dernière ligne
Je pense que vous pouvez utiliser Powermock pour ce faire. J'ai été en mesure de se moquer URL classe à l'aide de PowerMock ces derniers temps. Espérons que cette aide.
/* La classe */
/* Classe de Test */
Je regarde à nouveau pourquoi vous voulez de se moquer un dernier objet de données. Puisque, par définition, vous n'avez pas de sous-classement de l'objet dans votre code, et ça ne va pas être l'objet sous test, vous ne devriez pas avoir à le blanc-boîte de tester ce code; il suffit de passer à autre chose (réel) URL objets sont appropriés, et de vérifier la sortie.
Les objets fantaisie sont utiles lorsqu'il est difficile de créer un véritable objet approprié, ou la vraie méthode de l'objet sont longues ou dépendent de certains stateful ressource externe (comme une base de données). Ni l'un ni l'appliquer dans ce cas donc je ne vois pas pourquoi vous ne pouvez pas construire une URL réelle de l'objet représentant la ressource appropriée emplacement.
JMockit en effet vous permettre de simuler une finale JRE classe comme java.net.URL.
Il semble que l'attachement de l'API dans jdkDir/lib/tools.jar disponible dans les implémentations de JDK 1.6 autre que le Soleil ne fonctionne pas ainsi. Je suppose que ce genre de choses est encore trop nouveau/avancé, ou tout simplement ne pas obtenir l'attention nécessaire à partir de l'autre JDK constructeurs (Apple, IBM avec le J9 JDK Oracle avec le JRockit JDK).
Donc, si vous rencontrez des problèmes en ayant tools.jar dans le classpath, essayez d'utiliser l'option "-javaagent:jmockit.jar" l'argument JVM. Il raconte la JVM de charger directement la java agent au démarrage, sans l'aide de l'attachement de l'API. Qui doit travailler dans l'Apple JDK 1.5/1.6.
Créer un URL-objet pointant vers la classe de test lui-même.
Ne l'URL classe implémente une interface? Si oui, alors vous pourriez l'instancier à l'aide de l'inversion de contrôle ou un configurable en usine, plutôt que par une construction directe, cela vous permettrait d'injecter/construire une instance de test au test d'exécution plutôt que le dernier exemple que vous avez actuellement.