Giannis
Giannis

Reputation: 5526

Grails Test Domain Model - Mocks

I am trying to test some methods within a Domain object, the code seems to execute (based on log) but the assertions fail.

The code being tested (extendDates), is working, I am just adding the unit tests now. I assume I am doing something wrong in the mocking.The following is a simplified version of my code. Based on the log output, the assertion should pass.

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
    }
}

Upvotes: 1

Views: 147

Answers (2)

Steve
Steve

Reputation: 31

In your example you test for

if (create_new)

The variable "create_new" is never set and would therefore test false using groovy truth logic, thus never executing the if statement.

The if statement never adds anything to the "eventDates" property of Appointments, this would also mean that the assertion would fail.

I'm thinking your example is incomplete and therefore cannot help you until you expand it.

Upvotes: 3

Shashank Agrawal
Shashank Agrawal

Reputation: 25807

Yes, you will get NullPointerException in the assert condition. The reason being that, you are creating instance of EventDate in the extendDates method but you are not really adding it to the eventDates list in Appointments domain.

So, you have to modify your that method something like:

// 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)
 }

Now, your test case should work your assert condition.

(Also, looks like you have not added nullable constraint in end but passing the null value while creating instance of EventDate, may be not included in sample code)

Upvotes: 1

Related Questions