Устранение неполадок NullPointerException в Grails - PullRequest
1 голос
/ 06 декабря 2010

предисловие: я только начинаю изучать Grails, так что я уверен, что есть много других проблем и возможностей для оптимизации.

У меня есть два домена, родительский (коллекция) и дочерний (событие), в сопоставлении один ко многим.Я пытаюсь написать интеграционный тест для удаления детей.До рассматриваемого кода я успешно создал родителя и трех детей.У меня проблемы с получением одного ребенка, готовящегося удалить его.Первая строка моего примера кода есть только из-за моей элементарной попытки устранения неполадок.

// lines 95-100 of my EventIntegrationTests.groovy file
// delete a single event
assertEquals("2nd Event", event2.title)     // passes
def foundEvent = Event.get(event2.id)       // no apparent problems
assertEquals("2nd Event", foundEvent.title) // FAILS (line #98)
foundEvent.delete()
assertFalse Event.exists(foundEvent.id)

Я получаю сообщение об ошибке:

 Cannot get property 'title' on null object 

 java.lang.NullPointerException: Cannot get property 'title' on null object
         at edu.learninggrails.EventIntegrationTests.testEventsDelete(EventIntegrationTests.groovy:98)

Что должно быть при следующем устранении неполадокшаги быть?(Поскольку первый assertEquals проходит, event2 явно не равен нулю, поэтому на данный момент я понятия не имею, как устранить неисправность сбоя второго assertEquals.)

Ответы [ 3 ]

1 голос
/ 06 декабря 2010

Это не видно из кода: вы сохранили event2, вызвав save()?Get попытается извлечь его из постоянного хранилища (например, из базы данных в памяти), и если событие не было сохранено, извлеченный экземпляр будет иметь нулевое значение.

Если вы сохранили его, то сделали сохранениепройти через ОК?Вызов event.save() вернет false, если при сохранении элемента произошла ошибка (например, ошибка проверки).Наконец, вы можете попытаться вызвать event.save(flush:true) в случае, если сеанс Hibernate не обрабатывает этот случай, как вы могли ожидать (я не совсем уверен в этом, но попробовать не помешает).

0 голосов
/ 07 декабря 2010

Не думаю, что вы успешно спасли родителя и его детей. после сохранения вы должны убедиться, что каждый сохраненный объект имеет ненулевой идентификатор в вашем тесте.

То, что вы видите, это то, что вы создали событие2 с заголовком, но не сохранили его. Он проходит первое утверждение, потому что вы его создали. Когда вы выполняете get, возвращается значение null, поскольку сохранение не удалось.

в целом для интеграционных тестов DAO я делаю следующее

  1. Настройка - создание всех объектов, которые я буду использовать в тесте.
  2. Сохранить - подтвердить, что все идентификаторы на сохраненных объектах НЕ равны нулю.
  3. Очистить сеанс гибернации - это важно, потому что, если вы этого не сделаете, объекты могут находиться в сеансе из предыдущих операций. В вашем реальном сценарии вы, вероятно, начнете с поиска, то есть с пустой сессии. Другими словами, вы не собираетесь начинать с чего-либо в сеансе. Если вам нужно, вы должны настроить это правило так, чтобы сеанс в тесте, когда вы запускаете фактическую часть тестирования, был таким же, как сеанс кода в подстановке
  4. Загрузите объекты, с которыми вы хотите работать, и делайте то, что вам нужно.
0 голосов
/ 07 декабря 2010

Попробуйте напечатать или проверить event2.id в строке 97 и проверьте, действительно ли у вас есть идентификатор, если это так, проверьте, действительно ли вы получили объект Event в строке 97.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...