Wie kann ich verspotte JodaTime aktuelle Datum?
Ich möchte testen dieser Methode:
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();
}
aber ich brauche DateTime().year().get()
und DateTime().dayOfMonth().get()
immer wieder den gleichen Datum
tks
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie können nicht hinzufügen ein factory-Objekt, wie vorgeschlagen, durch skaffman, die Sie verwenden können,
DateTimeUtils.setCurrentMillisFixed()
.setCurrentMillisSystem
nach Ihrem test Behauptungen.Dann müssen Sie zum definieren einer
Clock
- Schnittstelle, und Spritzen es in Ihre Klassedann:
Ihrem test kann dann injizieren eine Implementierung von
Clock
(z.B. mit einem mocking-framework), die immer wieder eine Feste Zeit.Ich die
Clock
Schnittstelle eine Menge in meinen eigenen Sachen, und ich bin weiterhin überrascht, dass es nicht Teil eines der gemeinsamen Bibliotheken gibt. Ich habe zwei Implementierungen, die ich benutze eine Menge,WallClock
undStoppedClock
(was ist nützlich für tests, die Verwendung einer festen Zeit).Clock#getCurrentDateTime()
zurückkehren wird mir die aktuelleJodaTime#DateTime
, das ist toll. Allerdings muss ich vergleichen Sie die aktuellen DateTime-bis 4PM EST. In meinem code habe ich in diesemfourPM = new DateTime(current.getYear(), current.getMonthOfYear(), current.getDayOfMonth(), 16, 0, 0, 0, DateTimeZone.forID("EST"));
fürcurrent = new DateTime()
clock.now()
Aussieht, die einzige option ist die Verwendung der Antwort-Funktion in diesem post Kommentar:
Den folgenden Teil des Codes führen kann, um schwer zu erkennende Fehler:
Let ' s pretend tha heute ist der Letzte Tag des Jahres 2011 und in diesem Teil des Codes aufgerufen wird, 1 nano-Sekunde vor dem neuen Jahr und, dass die erste Anweisung dauert mehr als 1 nano-Sekunde. Dies bedeutet, dass Jahr auf Jahr 2011 aber Monat bis zu 1 musste es aber am besten, entweder 2011/12 oder 2012/1.
Aber, dass, statistisch ist es sehr unwahrscheinlich, aber logisch kann es passieren 🙂
Sollten Sie ein DateTime-Instanz und verwenden, füllen Sie beide
year
undmonth
.Es ist einfach, wenn Sie mit der JMockit Erwartungen mocking-API:
DateTime
(oderjava.util.Date
) ist immer schlecht? Was ist mit code, der die Verwendung der Apache Commons E-Mail-API, die instanziiert einSimpleEmail
- Objekt und ruftsend()
drauf??? Ist es schlechter code? Warum?