java: comment se moquer de Calendrier.getInstance()?
Dans mon code j'ai quelque chose comme ceci:
private void doSomething() {
Calendar today = Calendar.getInstance();
....
}
Comment puis-je "fictif" dans mon test junit pour revenir à une date précise?
- Cette ligne ne pouvait pas être de la compilation!
- Est
today
un membre de la classe (sur le terrain) ou une variable locale à l'intérieur d'une méthode? - variable locale à l'intérieur d'une méthode
Vous devez vous connecter pour publier un commentaire.
Aussi loin que je le vois, vous avez trois sensible options:
Injecter le
Calendar
instance, quelle que soit la méthode/classe vous définir en un jour.private void method(final Calendar cal)
{
Date today = cal.getTime();
}
Utilisation JodaTime au lieu de
Calendar
. C'est de moins en moins une option, en plus d'un cas d'une suggestion que JodaTime feront de votre vie beaucoup plus facile. Vous aurez toujours besoin d'injecter ce temps dans la méthode.DateTime dt = new DateTime();
Date jdkDate = dt.toDate();
Envelopper
Calendar
à l'intérieur d'une interface qui vous permet de récupérer le temps. Vous alors juste se moquer de cette interface, et d'obtenir le retour d'une constanteDate
.Date today = calendarInterfaceInstance.getCurrentDate()
DateTimeUtils
classe possède des méthodes statiques qui permet de régler l'heure pour tous les autres Joda Time objets. Ceci est très utile pour définir le temps à un certain moment, par exemple pour les tests.Vous pouvez le simuler à l'aide de PowerMock en combinaison avec Mockito:
Sur le dessus de votre classe:
La clé du succès est que vous avez à mettre la classe où vous utilisez le Calendrier dans PrepareForTest au lieu de Calendrier lui-même, car c'est un système de classe. (J'ai personnellement eu à chercher beaucoup avant, j'ai trouvé ce)
Puis le se moquant de lui-même:
Ne raillez pas - au lieu de présenter une méthode, vous pouvez maquette qui obtient les dates. Quelque chose comme ceci:
Ensuite, vous pouvez injecter dans votre classe ou tout simplement utiliser une classe d'assistance avec un tas de méthodes statiques avec une méthode de chargement de l'interface:
Puis dans le code de votre application:
Vous pouvez ensuite il suffit de charger une maquette de l'interface dans vos méthodes de test.
Voir aussi Si vous n'moquer de vous-même? et Test de l'odorat - tout est moqué de
À l'aide de Mockito et PowerMockito:
Reportez-vous à la lien pour le code complet.
Écrire une classe appelée
DateHelper
avec une méthodegetCalendar
qui renvoieCalendar.getInstance()
. Refactoriser la classe que vous faites des tests de sorte qu'il a une variable membre de typeDateHelper
, et un constructeur qui injecte cette variable membre. Utiliser un constructeur dans votre test, pour injecter un simulacre deDateHelper
, dans lequelgetCalendar
a été extraite d'un éventuel retour date connue.Vous pouvez mockit à l'aide de JMockit. Ici vous pouvez voir comment vous pouvez le faire: Se moquer de Java Calendrier - JMockit vs Mockito.