我想我需要在GebSpec测试中刷新hibernate会话,所以我想得到sessionFactory。
看起来它应该被注射但是当我做这样的事情时: -
class MySpec extends GebSpec {
def sessionFactory
...
def "test session"(){
....do some setup
then:
assert sessionFactory != null
}
它失败,sessionFactory为null。
答案 0 :(得分:5)
对我的问题的简短回答是 - 你为什么要这样做,这是一个功能测试,它可能远离正在运行的应用程序JVM。
原因是因为我想在Web内容发生时检查域对象是否已更新。 Luke Daley亲切地指出你可以使用远程控制Grails插件(https://github.com/alkemist/grails-remote-control)来做到这一点,这非常酷。你安装插件然后去
assert remote {
MyDomainOb.findByName('fred') != null
}
它发送闭包在服务器上执行并返回结果,你可以测试。结果必须是可序列化的。
好的,这是一种方式 - 但是如果由于强加给你的域模型而导致很多复杂的对象发生变化,那么远程插件有点难以获得测试结果。那么当你在同一个JVM上时,如何做你得到测试hibernate会话?像这样: -
Session currentSession
def setup() {
ApplicationContext context = (ApplicationContext) ServletContextHolder.getServletContext().getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT);
SessionFactory sf = context.getBean('sessionFactory')
currentSession = sf.getCurrentSession()
}
将它添加到GebSpec的顶部然后你可以调用currentSession.clear()或currentSession.flush()
我需要让测试会话更新,所以currentsession.clear()才是答案。
请注意,如果被测目标位于单独的VM中,则无法帮助您,因此您必须使用远程。