0

我正在使用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

4 回答 4

5

请注意:我在 2013 年写了这个答案。现在情况有点不同了。Basil Bourque 的答案是正确的。

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

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());
    }
}
于 2013-08-05T01:22:10.900 回答
2

因此,针对获取当前日期的代码编写单元测试的需求非常普遍。我与它斗争了无数次,最后写了一个解决方案。我的解决方案是有一个DateSupplier包装对new Date(). 然后我有一个名为的测试类DateController,它允许单元测试控制DateSupplier返回的值。

以下是链接: DateSupplier

日期控制器

DateSupplier写了一个static方法来获取Date. 这可以防止编码人员不得不在各处导入实例。

DateController写成 a Rule,将 back 的行为搁置为DateSupplier返回的默认行为new Date()

于 2013-08-05T10:59:33.117 回答
1

Java 8java.time.Clock

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

乔达时间

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

转换

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

于 2014-02-08T07:38:58.893 回答
0

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

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

在这种情况下,上面的陈述是正确的,但 cal.getTime() 会返回不同的东西。您的意思是要模拟 cal.getTime() 吗?

于 2013-08-04T22:14:59.463 回答