2016-12-01 5 views
0

Ich habe versucht, mir selbst zu beweisen, dass AddTo sowohl das hinzugefügte Domain-Objekt als auch seine Eltern mit einem Speichern auf dem Eltern speichern wird. Ich konstruierte diesen einfachen Test:Grails: Problem mit AddTo

package testapp 

import grails.test.mixin.TestFor 
import spock.lang.Specification 

/** 
* See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions 
*/ 
@TestFor(Person) 
class PersonSpec extends Specification { 

    def setup() { 
    } 


    def cleanup() { 
    } 

    void "test PersonCreation"() { 
     when: "create a person with a hobby" 
     Hobby h = new Hobby(name: "Fishing") 
     Person p = new Person() 
     p.first="Sam" 
     p.last="Parker" 
     p.age = 30 
     p.addToHobby(h) 
     p.save() 
     then: "Hobby is saved as well" 
     Hobby.count() == 1 
    } 
} 

es Rennen, erzeugte jedoch diesen Fehler bei der p.addToHobby(h) Linie:

java.lang.NullPointerException 
    at org.grails.datastore.gorm.GormEntity$Trait$Helper.addTo(GormEntity.groovy:350) 
    at testapp.PersonSpec.test PersonCreation(PersonSpec.groovy:27) 


Process finished with exit code 255 

Die Domain-Klassen sind so einfach wie man erwarten könnte:

Person :

package testapp 

class Person { 

    String first 
    String last 
    Integer age 

    static hasMany = [hobby: Hobby] 

    static constraints = {} 
} 

Hobby:

class Hobby { 
    String name 
    static constraints = {} 
    static belongsTo = [person: Person] 

} 

Ich habe versucht, zu reinigen und neu zu kompilieren, keine Änderung. (Grails Version 3.2.2)

Antwort

1

Sie benötigen die @Mock Annotation für Person und Hobby. Dadurch werden die dynamischen Methoden (wie addTo) zu den Domänenklassen hinzugefügt.

@Mock([Person, Hobby]) 
class PersonSpec extends Specification { 
    ...your test code... 
}