Grails 在GORM中创建树状结构

Grails 在GORM中创建树状结构,grails,groovy,tree,gorm,Grails,Groovy,Tree,Gorm,我试图在GORM中正确定义树结构,但遇到了问题 我有一个域对象: class Navigation { Navigation parent List children; String name; static belongsTo = [parent: Navigation] static hasMany = [children: Navigation] static constraints = { parent(nullable

我试图在GORM中正确定义树结构,但遇到了问题

我有一个域对象:

class Navigation {
    Navigation parent
    List children;
    String name;

    static belongsTo = [parent: Navigation]
    static hasMany = [children: Navigation]

    static constraints = {
        parent(nullable: true);
    }
}
以及测试:

void testTree() {
    Navigation root = new Navigation(name:"root");
    Navigation top1 = new Navigation(name:"home");
    Navigation top2 = new Navigation(name:"services");

    root.addToChildren(top1).addToChildren(top2).save(flush: true);

    Navigation s1 = new Navigation(name:"plumbing")
    Navigation s2 = new Navigation(name:"baking")

    top2.addToChildren(s1).addToChildren(s2).save(flush: true);

    Navigation t = Navigation.findByName("root")
    assert t.children.size() == 2
}
如果运行此测试,则会出现以下错误:

org.codehaus.groovy.runtime.InvokerInvocationException: groovy.lang.MissingMethodException: No signature of method: grails.Navigation.addToChildren() is applicable for argument types: (grails.Navigation) values: [grails.Navigation : null]
如果我将该测试的内容放入boostrap,我不会得到该错误,应用程序就会启动,除非导航表是空的


我能做些什么来解决这个问题?

您需要模拟导航域,以便在单元测试中使用GORM方法

将此添加到测试用例的顶部:

mockDomain(Navigation)

我不知道为什么你的导航表是空的,如果你把代码在引导,但我认为这一定是一个错误,在你的引导代码。我检查了该测试是否不仅仅是“测试域模拟代码”,方法是将其设置为集成测试,并删除对mockDomain()的调用。它还是过去了。很可能是由于域未成功保存,引导后导航表为空。添加到您的引导保存中,作为健全性检查。您是对的,先生,我的引导代码中有一个问题,一些重要的内容没有保存,导致所有内容都失败我相信您希望使用
mappedBy