我想我需要在 GebSpec 测试中刷新休眠会话,所以我想获得 sessionFactory。
看起来它应该被注入但是当我做这样的事情时: -
class MySpec extends GebSpec {
def sessionFactory
...
def "test session"(){
....do some setup
then:
assert sessionFactory != null
}
它因 sessionFactory 为空而失败。
我的问题的简短回答是 - 你为什么要这样做,这是一个功能测试,它可能远离正在运行的应用程序 JVM。
原因是因为我想在 Web 事件发生时检查域对象是否已更新。Luke Daley 好心地指出,您可以使用非常酷的 Remote-Control Grails 插件( https://github.com/alkemist/grails-remote-control )来做到这一点。你安装插件然后去
assert remote {
MyDomainOb.findByName('fred') != null
}
它发送该闭包以在服务器上执行并返回结果,您可以对其进行测试。结果必须是可序列化的。
好的,这是一种方法——但是如果你有很多复杂的对象由于强加给你的域模型而在后台发生变化,那么远程插件就很难获得测试结果。那么,当您在同一个 JVM 上时,如何获得测试休眠会话?像这样:-
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 中,这对您没有帮助,因此您必须使用远程。