我有点困惑,我有一个方法可以在今天前一天返回日期,但我现在还没有如何测试它:
public String getBeforeDay(int noDays){
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH,-noDays);
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = calendar.getTime();
return dateFormat.format(date);
}
@Test
public void testGetBeforeDay(){
assertEquals("2014-04-02", dateService.getBeforeDay(10));
}
并且由于assertEquals中的字符串是硬编码的,因此tommorow测试不会通过。解决此类测试的好习惯是什么?
答案 0 :(得分:4)
解决此类测试的好习惯是什么?
问题在于你依赖于短暂的事情:当前的日期/时间。
我更喜欢这个解决方案是引入Clock
作为依赖关系(与任何其他依赖关系一样处理)的想法,它可以告诉你当前时间。例如:
public interface Clock {
Date now();
}
然后,您可以拥有一个使用系统时钟的实现,以及一个用于测试的虚假实现。在getBeforeDay
方法中,您使用以下内容初始化Calendar
calendar.setTime(clock.now());
我已经在各种项目中非常成功地使用了这种方法,并且Java 8中的java.time
包附带了它。(如果你可以使用java.time
而不是{{1这样做!)