2010-12-06 4 views
1

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

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

// 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 проходят, событие2 явно не является нулевым, поэтому на этом этапе я не знаю, как устранить неисправность второго assertEquals.)

ответ

1

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

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

+0

Я пытаюсь создать свое собственное учебное приложение, когда прокладываю себе путь через «Grails in Action» Смита и Ледбрука (2009). В своем коде и последующем объяснении отношений 1: m они указывают, что дочерний экземпляр сохраняется просто путем добавления его к родительскому (стр.83 и 84), поэтому я не попытался явно «сохранить()». Я пробовал несколько разных итераций «event2.save()» и «event.save (flush: true)». Раньше я не думал, что я бегу «чистым» так же последовательно и часто, как и следовало бы, поэтому я получал непоследовательные результаты. – CyberZ 2010-12-07 23:42:48

+0

На данный момент мой код: – CyberZ 2010-12-07 23:46:35

+0

На данный момент мой код для этого раздела: // удаляем одно событие assertEquals («A10 событие 2», event2.title) event2.save (flush: правда) event2.id.inspect() Защита foundEvent = Event.get (event2.id) foundEvent.inspect() assertEquals ("A '10 второго события", foundEvent.title) foundEvent.delete() assertFalse Event.exists (foundEvent.id) – CyberZ 2010-12-07 23:57:51

0

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

0

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

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

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

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