Unit testing Grails测试域模型-模拟
我试图在一个域对象中测试一些方法,代码似乎是基于日志执行的,但是断言失败了 正在测试的代码extendDates正在运行,我现在只添加单元测试。 我假设我在模拟中做错了什么。根据日志输出,断言应该通过Unit testing Grails测试域模型-模拟,unit-testing,grails,testing,Unit Testing,Grails,Testing,我试图在一个域对象中测试一些方法,代码似乎是基于日志执行的,但是断言失败了 正在测试的代码extendDates正在运行,我现在只添加单元测试。 我假设我在模拟中做错了什么。根据日志输出,断言应该通过 class EventDate{ Date startDate Date endDate belongsTo = [Appointments owner] static constraints = { endDate(nullable:true, blank:fa
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
}
}
是的,您将在断言条件中获得NullPointerException。原因是,您正在extendDates方法中创建EventDate实例,但实际上并没有将其添加到约会域中的eventDates列表中
因此,您必须修改该方法,例如:
// 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)
}
现在,您的测试用例应该满足您的断言条件
另外,看起来您最后没有添加nullable约束,但在创建EventDate实例时传递null值,可能未包含在示例代码中。是的,您将在断言条件中获得NullPointerException。原因是,您正在extendDates方法中创建EventDate实例,但实际上并没有将其添加到约会域中的eventDates列表中
因此,您必须修改该方法,例如:
// 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)
}
现在,您的测试用例应该满足您的断言条件
另外,看起来您最后并没有添加nullable约束,但在创建EventDate实例时传递了null值。在您测试的示例中,示例代码中可能没有包含此约束
if (create_new)
变量create_new从未设置,因此将使用groovy真理逻辑测试false,因此从未执行if语句
if语句从不向约会的eventDates属性添加任何内容,这也意味着断言将失败
我认为您的示例是不完整的,因此在您扩展它之前无法帮助您。在您的示例中,您测试了
if (create_new)
变量create_new从未设置,因此将使用groovy真理逻辑测试false,因此从未执行if语句
if语句从不向约会的eventDates属性添加任何内容,这也意味着断言将失败
我认为您的示例是不完整的,因此在您扩展它之前无法帮助您。对,我为这些错误道歉,您应该更仔细地复制代码。正如我在描述中所添加的,extendDates方法已经过手动测试,并且按照预期工作。此外,在实际代码中,不需要显式地拒绝列表,只需要关联就可以了。不管怎样,这都是正确的。这个问题没有出现在我的代码中。我猜测试达到了目的^ ^对,我为这些错误道歉,应该更仔细地复制代码。正如我在描述中所添加的,extendDates方法已经过手动测试,并且按照预期工作。此外,在实际代码中,不需要显式地拒绝列表,只需要关联就可以了。不管怎样,这都是正确的。这个问题没有出现在我的代码中。我猜这次测试达到了目的^_^