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

Java 今天前N天返回的测试方法,java,junit,Java,Junit,我有点困惑,我有一个返回日期N的方法,但我现在不知道如何测试它: 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

我有点困惑,我有一个返回日期N的方法,但我现在不知道如何测试它:

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测试将无法通过。解决此类测试的好方法是什么

解决此类测试的好方法是什么

问题是你依赖于一些短暂的东西:当前的日期/时间

我更喜欢的解决方法是引入时钟的概念,将其作为一个依赖项来处理,就像处理任何其他可以告诉您当前时间的依赖项一样。例如:

public interface Clock {
    Date now();
}
然后,您可以有一个使用系统时钟的实现,以及一个用于测试的假实现。在getBeforeDay方法中,可以使用以下命令初始化日历:

我已经在各种项目中非常成功地使用了这种方法,Java8中的java.time包也随之诞生。如果您可能使用java.time而不是java.util.*,请这样做

解决此类测试的好方法是什么

问题是你依赖于一些短暂的东西:当前的日期/时间

我更喜欢的解决方法是引入时钟的概念,将其作为一个依赖项来处理,就像处理任何其他可以告诉您当前时间的依赖项一样。例如:

public interface Clock {
    Date now();
}
然后,您可以有一个使用系统时钟的实现,以及一个用于测试的假实现。在getBeforeDay方法中,可以使用以下命令初始化日历:

我已经在各种项目中非常成功地使用了这种方法,Java8中的java.time包也随之诞生。如果您可能使用java.time而不是java.util.*,请这样做