你如何在Grails Geb / Spock测试用例中获得sessionFactory?

时间:2011-06-01 04:20:52

标签: grails groovy spock geb

我想我需要在GebSpec测试中刷新hibernate会话,所以我想得到sessionFactory。

看起来它应该被注射但是当我做这样的事情时: -

class MySpec extends GebSpec {
def sessionFactory
...
def "test session"(){
....do some setup
then: 
  assert sessionFactory != null
}

它失败,sessionFactory为null。

1 个答案:

答案 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中,则无法帮助您,因此您必须使用远程。