Класс домена Grails, не сохраненный в тесте - PullRequest
1 голос
/ 11 декабря 2019

Я относительно новичок в Grails и создаю приложение для управления событиями. У меня проблема с тем, что один из классов моего домена не сохраняется после вызова метода .save(), а только во время тестирования.

Итак, я упростил три класса домена: Персона, Событие и Участие. У меня проблемы с участием:

class Participation implements Serializable {

    private static final long serialVersionUID = 1

    Person person
    Event event

    static Participation create(Person person, Event event, boolean flush = false) {
        def instance = new Participation(person: person, event: event)
        instance.save([failOnError: true, flush: flush])
        instance
    }

    static constraints = {
        person nullable: false
        event nullable: false, validator: { Event e, Participation pt ->
            if (pt.person?.id) {
                if (Participation.exists(pt.person.id, e.id)) {
                    return ['participation.exists']
                }
            }
        }
    }

    static mapping = {
        id composite: ['person', 'event']
        version false
    }
}

Я пытаюсь проверить, что произойдет, если человек присоединится к событию, которое уже заполнено, это обрабатывается в службе:

@Transactional
class UserService {

    def join(Person p, Event e) {
        if (e.getParticipants().size() >= e.maxParticipants) {
            throw new EventFullException()
        }
        Participation.create(p, e)
    }

}

Мой тест выглядит следующим образом:

class UserServiceSpec extends HibernateSpec implements ServiceUnitTest<UserService>{

    void "a person cannot join a full event"() {
        when:
        Person p1 = save(new Person(name: "Test1"))
        Person p2 = save(new Person(name: "Test2"))
        Event e = save(new Event(name: "Event", start: LocalDateTime.now().plusDays(1), maxParticipants: 1))
        service.join(p1, e)

        then:
        // Participation for some reason not saved ):
        shouldFail(EventFullException) {
            service.join(p2, e)
        }
    }

    private def save(domain) {
        domain.save flush: true, failOnError: true
    }

Я вижу, что объекты домена Event и Person сохраняются, как и ожидалось, но для объекта участия отладчик (IntelliJ) отображает «несохраненный» рядом с ним. ,Это также тот случай, если я позвоню def part = save(new Participation(p1, e)) напрямую. Так что e.getParticipants().size() равно 0, когда join(...) вызывается во второй раз, и ошибка не выдается.

Все это работает, когда я нормально запускаю приложение и проверяю его вручную в браузере.

Что мне здесь не хватает? Спасибо за помощь.

1 Ответ

0 голосов
/ 24 декабря 2019

Возможно, вам потребуется аннотировать ваш тестовый класс с помощью @Mock([Participation, Person, Event]).

...