Grails测试域模型 - 模拟

时间:2015-05-22 11:35:17

标签: unit-testing grails testing

我试图在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
    }
}

2 个答案:

答案 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的实例时传递空值,可能不包含在示例代码中)