Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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/spring/13.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 测试包含日期字段的对象_Java_Spring_Testing - Fatal编程技术网

Java 测试包含日期字段的对象

Java 测试包含日期字段的对象,java,spring,testing,Java,Spring,Testing,我有一个类,它有一个Bill生成的方法。我有一个DateUtil组件来创建日期 public Bill generateBill(List<ProvidedItem> providedItems) { Bill bill = new Bill(); Date date = dateUtil.now(); bill.setStartDate(date); bill.setEndDate(dateUtil.plusDays(date, Constant

我有一个类,它有一个Bill生成的方法。我有一个DateUtil组件来创建日期

public Bill generateBill(List<ProvidedItem> providedItems) {
    Bill bill = new Bill();

    Date date = dateUtil.now();

    bill.setStartDate(date);
    bill.setEndDate(dateUtil.plusDays(date, ConstantValues.DEFAULT_DURATION_BILL_DAYS));

    return billDao.saveOrUpdate(bill);
}
比尔妈妈:

public static Bill createTestInstanceWithAmount(BigDecimal totalAmount, Date startDate, Date endDate) {
    Bill bill = new Bill();
    bill.setStartDate(startDate);
    bill.setEndDate(endDate);
    bill.setTotalAmount(totalAmount);
    return bill;
}
我有不同的对象,因为日期是在另一个时间调用的

我不能在Equals方法中跳过这些日期,因为它们是这个对象最重要的部分之一


如何使其在这种情况下正常工作?

如果唯一使您无法成功测试该方法的因素是日期字段,那么您可以使用actualBill的开始和结束日期来设置测试实例的开始和结束日期,这是假设您的Bill类具有这两个字段的getter

哦,还有一点建议,我想你要比较的是对象的内容,而不是对象本身。因为,除非您特别重写Bill类中的equals()方法,否则只有当两个Bill引用引用相同的对象时,它们才会相等

一个可能的解决方案是,正如我所说的,重写类Bill中的equals()方法,如下所示:

 @override public boolean equals(Object o){  
    return o.instanceof(Bill) &&  
    o.getStartDate().equals(startDate) &&  
    o.getEndDate().equals(endDate) &&  
    o.getTotalAmount()==totalAmount;  
    }
最后一件事,我会考虑使用java。时间库,因为它提供了比那些“旧”库更为新近、更有用和更有效的一组。可以使用LocalDate而不是Date。

使用Mockito:

@Mock DateUtil dateUtil

when(dateUtil.now()).thenReturn(NOW);

您可以使用mockito模拟dateUtil(如上面的答案所示)

when(dateUtil.now()).thenReturn(newdate())

您可以使用powerMockito模拟日期实例化


whenNew(Date.class).withNoArguments()。然后return(new Date()) 

如果你认为你的方法是非静态的,这将允许你对行为进行简单的嘲讽。它对测试方法中的所有日期都有效。但是在测试的方法中调用
dateUtil.Now()
不再有效。所以它不再解决问题了。我做错什么了吗?
Bill actualBill=billService.generateBill(actualProvidedItems)内部的此代码段将生成不同的日期
@Mock DateUtil dateUtil

when(dateUtil.now()).thenReturn(NOW);