我试图在Domain对象中测试一些方法,代码似乎执行(基于日志),但断言失败。
正在测试的代码(extendDates
)正在运行,我现在只是添加单元测试。
我假设我在模拟中做错了。以下是我的代码的简化版本。根据日志输出,断言应该通过。
class EventDate{
Date startDate
Date endDate
belongsTo = [Appointments owner]
static constraints = {
endDate(nullable:true, blank:false)
startDate(nullable:false, blank:false)
}
}
class Appointments {
hasMany = [ eventDates: EventDate]
belongsTo = [ customer: Customer ]
def extendDates(start,end){
//some logic on eventDates...
EventDate(startDate:start,endDate:end, owner:this).save(flush:true,failOnError:true);
}
}
@TestFor(Appointments)
@Mock([EventDate])
class AppointmentsTests {
void testDateExtend(){
assertTrue domain != null
assertTrue domain instanceof Appointments
//Log indicates the correct execution and creation of event
domain.extendDates(new Date(),null)
//following returns NullPointerException
assertTrue domain.eventDates.size() == 1
}
}
答案 0 :(得分:3)
在您的示例中,您要测试
if (create_new)
变量" create_new"永远不会被设置,因此会使用groovy真值逻辑测试false,因此永远不会执行if语句。
if语句从不向" eventDates"添加任何内容。约会的财产,这也意味着断言会失败。
我认为你的例子不完整,因此在扩展之前无法帮助你。
答案 1 :(得分:1)
是的,您将在断言条件中获得NullPointerException
。原因是,您要在EventDate
方法中创建extendDates
的实例,但实际上并未将其添加到eventDates
域中的Appointments
列表中。
所以,你必须修改你的方法,如:
// Initialize with empty array to avoid NPE
List<EventDate> eventDates = []
static hasMany = [ eventDates: EventDate]
def extendDates(start, end) {
EventDate instance = EventDate(start, end).save()
// And add it to the list of events
this.addToEventDates(instance)
this.save(flush: true)
}
现在,您的测试用例应该适用于断言条件。
(另外,看起来你没有在end
中添加可为空的约束,但在创建EventDate
的实例时传递空值,可能不包含在示例代码中)