Comment puis-je maquette JodaTime date réelle?
Je veux tester cette méthode:
public FirmOrder findActiveByModelColor(ModelColor modelColor) {
Query query = em.createQuery("FROM FirmOrder fo WHERE fo.modelColor = :modelColor AND fo.year = :year AND fo.month = :month");
query.setParameter("modelColor", modelColor);
query.setParameter("year", new DateTime().year().get());
query.setParameter("month", new DateTime().monthOfYear().get());
return (FirmOrder) query.getSingleResult();
}
mais j'ai besoin de DateTime().year().get()
et DateTime().dayOfMonth().get()
retourne toujours la même date
tks
Vous devez vous connecter pour publier un commentaire.
Si vous ne pouvez pas ajouter un objet de fabrique comme suggéré par skaffman, vous pouvez utiliser
DateTimeUtils.setCurrentMillisFixed()
.setCurrentMillisSystem
après votre test affirmations.Ensuite, vous devez définir un
Clock
de l'interface et de l'injecter dans votre classealors:
Votre test peut alors injecter une mise en œuvre de
Clock
(par exemple à l'aide d'un moqueur cadre) qui renvoie toujours à un moment fixé.- Je utiliser le
Clock
interface beaucoup dans mes propres trucs, et je reste surpris qu'il ne fait pas partie de l'une des communes de bibliothèques. J'ai deux implémentations j'utilise beaucoup,WallClock
etStoppedClock
(ce qui est utile pour les tests qui utilisent un temps fixe).Clock#getCurrentDateTime()
sera de retour me l'actuelleJodaTime#DateTime
, ce qui est excellent. Cependant j'ai besoin de comparer l'état actuel de DateTime à 4PM EST. Dans mon code, j'ai cettefourPM = new DateTime(current.getYear(), current.getMonthOfYear(), current.getDayOfMonth(), 16, 0, 0, 0, DateTimeZone.forID("EST"));
pourcurrent = new DateTime()
clock.now()
Regarde comme la seule option est d'utiliser la fonctionnalité de réponse à la publication de ce commentaire:
La partie suivante de votre code peut entraîner dur à détecter les erreurs:
Imaginons tha aujourd'hui est le dernier jour de l'année 2011 et que cette partie de code est appelé 1 nano seconde avant la nouvelle année et que la première instruction prend plus de 1 nano seconde pour terminer. Cela signifie que l'année sera mis à 2011, mais les mois à 1, mais il avait de meilleur, soit pour l'exercice 2011/12, ou 2012/1.
Bien que, statistiquement, il est très peu probable que cela arrive, mais logiquement, il peut arriver 🙂
Vous devez créer une instance de DateTime et l'utiliser pour remplir les deux de
year
etmonth
.C'est facile, si l'utilisation de la JMockit Attentes se moquant de l'API:
DateTime
(oujava.util.Date
) comme c'est toujours mauvais? Ce code à l'aide de l'Apache Commons API Email, qui instancie unSimpleEmail
objet et les appelssend()
sur elle? Est-il mauvais code? Pourquoi?