如何模拟JodaTime实际日期?

2022-09-01 19:44:56

我想测试这个方法:

 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();
 }

但我需要并始终返回相同的日期DateTime().year().get()DateTime().dayOfMonth().get()

断续器


答案 1

如果无法按照 skaffman 的建议添加工厂对象,则可以使用 DateTimeUtils.setCurrentMillisFixed()。


答案 2

然后,您需要定义一个接口,并将其注入到您的类中Clock

public interface Clock {
    DateTime getCurrentDateTime();
}

然后:

Clock clock;

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", clock.getCurrentDateTime().year().get());
   query.setParameter("month", clock.getCurrentDateTime().dayOfMonth().get());
   return (FirmOrder) query.getSingleResult();
 }

然后,您的测试可以注入一个实现(例如,使用模拟框架),该实现始终返回固定时间。Clock

我在我自己的东西中经常使用这个界面,我仍然惊讶于它不是那里的公共库之一的一部分。我有两个我经常使用的实现,并且(这对于使用固定时间的测试很有用)。ClockWallClockStoppedClock