2010-12-06 53 views
1

前言注意:我剛開始學習Grails,因此我確信還有許多其他問題和優化空間。排除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

這從代碼中不明顯:你是否通過調用來保持event2 save()?獲取將嘗試從持久存儲(例如內存數據庫)中檢索它,如果事件未保存,則檢索到的實例將爲空。

如果您確實保存了,保存是否通過OK?如果在保存項目時發生錯誤(如驗證錯誤),調用event.save()將返回false。最後,你可以嘗試調用event.save(flush:true)以防Hibernate會話不能像你所期望的那樣處理這種情況(我不完全相信這個,但它不會讓我們受傷)。

+0

我試圖通過Smith&Ledbrook的「Grails in Action」(2009)製作自己的學習應用程序。在他們的代碼和1:m關係的後續解釋中,他們指出只需將子實例添加到父項中即可堅持子實例(pp。83&84),所以我沒有試圖明確'save()'。我嘗試了幾個不同的'event2.save()'和'event.save(flush:true)'迭代。在我剛開始的時候,我並不認爲自己應該像往常一樣頻繁地運行「清潔」,所以我得到了不一致的結果。 – CyberZ 2010-12-07 23:42:48

+0

此時,我的代碼是: – CyberZ 2010-12-07 23:46:35

+0

此時,我的代碼爲: //刪除單個事件 assertEquals(「A'10 2nd Event」,event2.title) event2.save(flush:真) event2.id.inspect() DEF 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

嘗試打印或檢查線97上的event2.id和檢查,如果你真的有一個ID,如果是檢查,如果你真的在網上得到一個事件對象97

0

我不認爲你救母及其子女成功。在保存之後,您應該確保每個持久保存的對象在您的測試中都有一個非空ID。

你看到的是你用標題創建了event2,但沒有保存它。它傳遞了第一個斷言,因爲你創建了它。當你得到get時,返回null,因爲你的保存失敗。

一般用於DAO集成測試

我這樣做

  1. 設置 - 創建的所有對象在測試生病使用。
  2. 保存 - 聲明保存的對象上的所有ID都不爲空。
  3. 清除hibernate會話 - 這很重要,因爲如果您不這樣做,對象可能會在以前操作的會話中。在現實世界的場景中,您可能要從查找開始,即空的會話。換句話說,你不會在會議中開始任何事情。如果您需要調整此規則,以便在測試中啓動實際測試部件時的會話與野外代碼的會話相同
  4. 加載要操作的對象以及做你需要做的事情。