繁体   English   中英

无法模拟 Date 类

[英]Can't mock Date class

我正在使用 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(); 它总是打印当前日期。 请告知我应该如何模拟日历类,以便我可以在特定日期测试所有创建新数据实例的方法。

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

我会使用 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());
    }
}

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

以下是链接: DateSupplier

日期控制器

DateSupplier使用static方法编写以获取Date 这可以防止编码人员必须到处导入实例。

DateController被编写为一个RuleDateSupplier的行为恢复为返回new Date()的默认行为。

Java 8 java.time.Clock

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

乔达时间

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

转换

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM