的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中定义的“测试”环境。