создание древовидной структуры в GORM

Я пытаюсь правильно определить древовидную структуру в 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, я не получу эту ошибку, и приложение запустится, за исключением того, что таблица навигации пуста

что я могу сделать, чтобы исправить это?


person mkoryak    schedule 23.03.2011    source источник
comment
Думаю, вы захотите использовать mappedBy: grails.org/doc/ последний/ref/Domain%20Classes/mappedBy.html   -  person Victor Sergienko    schedule 24.03.2011


Ответы (1)


Вам нужно имитировать домен навигации, чтобы вы могли использовать методы GORM в своем модульном тесте.

Добавьте это в начало вашего тестового примера:

mockDomain(Navigation)
person Dana    schedule 23.03.2011
comment
Я не знаю, почему ваша навигационная таблица пуста, если вы помещаете код в Bootstrap, но я думаю, что это ошибка в вашем коде Bootstrap. Я проверил, что этот тест не просто проверяет код имитации домена, сделав его интеграционным тестом и удалив вызов mockDomain(). Все равно проходит. Скорее всего, ваша навигационная таблица пуста после Bootstrap, потому что домен не был успешно сохранен. Добавьте failOnError: true к Bootstrap сохраняет как проверку работоспособности. - person Dana; 23.03.2011
comment
вы правы, сэр, в моем коде начальной загрузки возникла проблема, что-то важное не было сохранено, и это привело к сбою - person mkoryak; 23.03.2011