无法模拟约会类



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

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

我的班级:

public class MYDate extends GregorianCalendar implements Comparable<Calendar> {
public MYDate() {
        setTime(new Date());
    }
}

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

请注意:我在 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());
    }
}

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

以下是链接:日期供应商

日期控制器

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

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

Java 8 java.time.Clock Class

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

乔达时间

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

转换

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

在你的代码中,你正在模拟一个特定的方法'cal.get(('。

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

在这种情况下,上面的语句是正确的,但cal.getTime((会返回不同的内容。你的意思是嘲笑cal.getTime((吗?

相关内容

  • 没有找到相关文章

最新更新