2014-10-08 3 views
0
@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

но в коде тестирования Unit, я не могу использовать @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 заранее

ответ

0

Поскольку вы фактически храните значения в базе данных и проверяете результат, вам следует выполнить интеграционный тест. Вы можете сделать это путем расширения 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.

Смежные вопросы