Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';模拟日期类_Java_Unit Testing_Junit_Mocking_Mockito - Fatal编程技术网

Java Can';模拟日期类

Java Can';模拟日期类,java,unit-testing,junit,mocking,mockito,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>

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

}
公共类MYDate扩展了GregoriaCalendar{
公共MYDate(){
设置时间(新日期());
}
}
但是当尝试打印
newmydate()时它总是打印当前日期。

请建议如何模拟calendar类,以便在特定日期测试创建新数据实例的所有方法。

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


在本例中,上述语句将为true,但cal.getTime()将返回不同的结果。你的意思是模拟cal.getTime()吗?

请注意:我在2013年写了这个答案。现在情况有点不同了。巴兹尔·布尔克的答案是正确的。

我将使用工厂类来创建
Date
对象,而不是使用
newdate()
。为
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());
    }
}
公共类日期工厂{
公共日期makeDate(){
返回新日期();
}
}
-----------------------------------
公共类MyDate扩展了GregorianCalendar实现{
公共MyDate(){
此(新的DateFactory());
}
MyDate(DateFactory工厂){
设置时间(factory.makeDate());
}
}

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

以下是链接:

DateSupplier
是使用
static
方法来获取
日期的。这可以防止程序员必须到处导入实例

DateController
是作为
规则编写的,该规则将
DateSupplier
的行为恢复为返回
new Date()
的默认行为 Java8中的新版本包含一个类,用于在开发和测试期间模拟日期时间

乔达时间 我记得,流行的框架还有一个伪造时钟的工具

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

日期不是日历……您能发布一些代码,让我们看看发生了什么吗?如果你正在做
new Date()
,那么你就不会使用你的模拟日历了。@David Wallace我更新了这个问题。@assylias,我更新了这个问题。
DateSupplier
可以更优雅地命名为:
Clock
@John B,我应该用什么jar作为参数在jboss上的默认注释?我还可以使用没有此注释的示例吗?是的,注释只是文档。它是在
jsr305
中提供的,这几乎不可能在Kotlin中实现,因为
getInstance()
受到保护。您能分享一下我如何在测试中使用DateFactory吗?正如我所说的。你嘲笑这家工厂。当您调用
makeDate
时,您可以将其存根以返回希望它返回的任何日期。在测试中,使用第二个
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());
    }
}