Grails Connections ведут себя очень по-разному в интеграционном тесте - PullRequest
6 голосов
/ 12 августа 2011

У нас есть пользовательский источник данных, который расширяет BasicDataSource.Мы переопределили метод getConnection, который выполняет внутри него несколько вещей.Когда мы запускаем веб-приложение вне тестирования, когда мы вызываем сервис из контроллера, оно будет захватывать новое соединение и использовать его до тех пор, пока сервис не будет завершен.Все хорошо.Однако в интеграционном тесте соединение, по-видимому, перехватывается до того, как тест даже вызовет контроллер.Поток ниже

Обычный запуск: контроллер вызовов -> контроллер вызывает метод обслуживания -> соединение установлено -> метод обслуживания запущен и возвращается к контроллеру

Интеграционный тест: соединение установлено -> контроллер вызоваиз теста -> контроллер вызывает сервисный метод -> сервисный метод запускается и возвращается к контроллеру

Излишне говорить, что это вызывает у нас проблемы, поскольку правильное соединение очень важно для нашего приложения.Мысли?

Редактировать: По-прежнему возникают серьезные проблемы с этим.Мы достигли точки, когда нам нужно избегать создания интеграционных тестов или выполнять какое-либо ручное переключение соединений (что обходит половину точки тестов)

DataSource.groovy

dataSource {
pooled = true
dialect="org.hibernate.dialect.OracleDialect"
properties {
    maxActive = 50
    maxIdle = 10
    initialSize = 10
    minEvictableIdleTimeMillis = 1800000
    timeBetweenEvictionRunsMillis = 1800000
    maxWait = 10000
    testWhileIdle = true
    numTestsPerEvictionRun = 3
    testOnBorrow = true
}

}
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = true
cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider'
}

1 Ответ

2 голосов
/ 18 августа 2011

Это не окончательный ответ, однако я считаю, что это объяснение происходящего:

  • Запуск в качестве веб-приложения : ваш класс обслуживания имеетTransactionManager, который имеет sessionFactory, который получает соединение!Таким образом, в этом случае при условии, что ваша Служба имеет значение «транзакция = истина», все методы, которые вы вызываете в своих службах, будут иметь «Session.beginTransaction ()» в начале метода (для этого есть прокси-сервер Grails)., когда вы устанавливаете'actional = true '), который будет вызывать весь этот стек до getConnection ().

  • Запуск в качестве интеграционного теста : поскольку Grails не передает вашИзменения БД, это всегда их откат!Я полагаю, что когда вы начинаете свой интеграционный тест, Grails сразу же создает транзакцию!так что он сможет откатить его позже!Метод init () вызывается перед вашими сервисами в вашем интеграционном тесте.Вот почему getConnection () вызывается раньше всего!

Предложение : Вы можете попробовать установить класс интеграционного теста как «транзакция = ложь» и посмотретьесли getConnection () не получает вызов в начале!Перейдите в раздел Транзакции в здесь , чтобы узнать больше!Только не забывайте, что в вашем тесте вам придется откатить транзакцию!если установленная транзакция = false.

...