在今天前N天返回的测试方法

时间:2014-04-12 09:11:49

标签: java junit

我有点困惑,我有一个方法可以在今天前一天返回日期,但我现在还没有如何测试它:

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测试不会通过。解决此类测试的好习惯是什么?

1 个答案:

答案 0 :(得分:4)

  

解决此类测试的好习惯是什么?

问题在于你依赖于短暂的事情:当前的日期/时间。

我更喜欢这个解决方案是引入Clock作为依赖关系(与任何其他依赖关系一样处理)的想法,它可以告诉你当前时间。例如:

public interface Clock {
    Date now();
}

然后,您可以拥有一个使用系统时钟的实现,以及一个用于测试的虚假实现。在getBeforeDay方法中,您使用以下内容初始化Calendar

calendar.setTime(clock.now());

我已经在各种项目中非常成功地使用了这种方法,并且Java 8中的java.time包附带了它。(如果你可以使用java.time而不是{{1这样做!)