Java Can';模拟日期类
我正在使用mockito,我有一个自定义日期类,我希望能够在测试类中模拟此日期类,因此我尝试了以下方法: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>
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());
}
}