对grails中的NullPointerException进行故障排除

时间:2010-12-06 20:11:10

标签: grails

前言注意:我刚开始学习Grails,所以我确信还有很多其他问题和优化空间。

我在一对多映射中有两个域,父(Collection)和子(Event)。我正在尝试编写一个删除子项的集成测试。在有问题的代码之前,我已经成功创建了一个父代和三个孩子。我遇到问题的一点是获得一个孩子准备删除它。我的示例代码的第一行只是因为我的初步尝试进行故障排除。

// 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显然不为null,所以此时我不知道如何解决第二个assertEquals失败的问题。)

3 个答案:

答案 0 :(得分:1)

从代码中可以看出这一点:你是否通过调用save()来坚持event2? Get将尝试从持久存储(例如内存数据库)中检索它,如果事件未保存,则检索到的实例将为null。

如果你确实保存了它,保存是否正常?如果在保存项目时出现问题(例如验证错误),则调用event.save()将返回false。最后,您可以尝试调用event.save(flush:true),以防Hibernate会话没有像您预期的那样处理这种情况(我不完全确定这个,但尝试不会有害)。

答案 1 :(得分:0)

尝试打印或检查第97行的event2.id并检查你是否确实有一个id,如果是,请检查你是否真的在第97行获得了一个Event对象。

答案 2 :(得分:0)

我不认为你成功地保存了父母及其子女。保存后,应确保测试中持久化的每个对象都具有非null id。

你看到的是你用标题创建了event2,但没有保存它。它传递了第一个断言,因为你创建了它。执行get时,返回null,因为保存失败。

一般来说,对于DAO集成测试,我会执行以下操作

  1. 设置 - 创建测试中使用的所有对象。
  2. 保存 - 声明保存对象上的所有ID都不为空。
  3. 清除hibernate会话 - 这很重要,因为如果不这样做,对象可以在以前操作的会话中。在您的真实场景中,您可能会以查找开始,即空会话。换句话说,您不会在会话中开始任何事情。如果您需要调整此规则,以便测试中的会话(当您启动实际测试部分时)与野外代码的会话相同
  4. 加载要操作的对象并执行您需要执行的操作。