无法模拟Date类

时间:2013-08-04 21:58:32

标签: java unit-testing junit mocking mockito

我正在使用mockito,我有一个自定义日期类,我希望能够在我的测试类中模拟这个日期类,所以我尝试了以下内容:

    MVDate date = Mockito.mock(MYDate.class);
    Mockito.when(date.get(Calendar.MONTH)).thenReturn(5);

MYDate类:

public class MYDate extends GregorianCalendar implements Comparable<Calendar> {

public MYDate() {
        setTime(new Date());
    }

}

但是在尝试打印new MYDate();时,它始终会打印当前日期。 请告知我应该如何模拟日历类,以便我可以在特定日期测试创建新数据实例的所有方法。

4 个答案:

答案 0 :(得分:4)

我会使用Factory类来制作Date个对象,而不是使用new Date()。拥有MyDate的第二个构造函数,您可以在其中传递Factory。然后使用工厂的模拟,你可以设置它来返回你喜欢的任何日期。

public class DateFactory{
    public Date makeDate(){
        return new Date();
    }
}

-----------------------------------

public class MyDate extends GregorianCalendar implements Comparable<Calendar>{

    public MyDate(){
        this(new DateFactory());
    }

    MyDate(DateFactory factory){
        setTime(factory.makeDate());
    }
}

答案 1 :(得分:1)

因此,需要针对获取当前日期的代码编写单元测试是非常常见的。我反对它多次,最后写了一个解决方案。我的解决方案是让DateSupplier包含对new Date()的调用。然后我有一个名为DateController的测试类,它允许单元测试控制DateSupplier返回的值。

以下是链接: DateSupplier

DateController

DateSupplier使用static方法编写,以获取Date。这可以防止编码员必须在整个地方导入实例。

DateController被写为Rule,它将DateSupplier的行为恢复为返回new Date()的默认行为。

答案 2 :(得分:0)

在您的代码中,您正在模拟特定方法'cal.get()'。

assertEquals(cal.get(Calendar.MONTH), 5);

在这种情况下,上面的语句将为true,但cal.getTime()将返回不同的内容。你的意思是模拟cal.getTime()吗?

答案 3 :(得分:0)

Java 8 java.time.Clock Class

Java 8中的新java.time.* package包含一个Clock类,用于在开发和测试期间模拟日期时间。

约达时间

我记得,流行的Joda-Time框架也有伪造时钟的工具。

转换

您可以根据需要轻松地在这些框架的日期时间对象和java.util.Date类之间进行转换。