我在一对多映射中有两个域,父(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失败的问题。)
答案 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集成测试,我会执行以下操作