的Grails /斯波克单元测试与SessionFactory的

的Grails /斯波克单元测试与SessionFactory的

问题描述:

@Transactional 
class service { 
    def sessionFactory 

    def doSomething(buildings) { 
     buildings.each { 
      def building -> 
       building.owner = 'John' 
       building.save(failOnError:true) 
     } 

     def session = sessionFactory.getCurrentSession() 
     checkNotNull(session) 
     session.flush() 
    } 
} 

该代码使所有的楼宇业主“约翰”或无的Grails /斯波克单元测试与SessionFactory的

但在单元测试代码,我不能使用@Mock(SessionFactory的),因为它是不在grails env。如果我莫克(SessionFactory的),如代码:

given: 
    service.sessionFactory = Mock(SessionFactory) 
    Session session = Mock(Session) 
    service.sessionFactory.getCurrentSession() >> session 

    Building building = new Building(communityId: 199).save(flush: true, failOnError: true) 

    when: 
    service.doSomething(Lists.newArrayList(building) 
    building = Building.findById(building.id) 

    then: 
    building.owner == 'John' 

然而building.owner为NULL,我觉得会冲洗不应该嘲笑

所以,我应该怎么办? thx

由于您实际将值存储在数据库中并测试结果,因此应该执行集成测试。你可以做到这一点通过扩展IntegrationSpec或使用@TestMixin(IntegrationTestMixin)如果你只是想从Specification延伸:

class ServiceSpec extends IntegrationSpec { 

    def "service test"() { 
     given: 
     Building building = new Building(communityId: 199).save(flush: true, failOnError: true) 

     when: 
     service.doSomething([building]) 
     building = Building.findById(building.id) 

     then: 
     building.owner == 'John'   
    } 
} 

只要确保你在你的正确DataSource.groovy中定义的“测试”环境。