Интеграция Grails 3 с тестами GEB "Сессия не найдена для текущего потока" - PullRequest
0 голосов
/ 08 января 2019

Я использую Grails 3.3.1 и получаю сообщение об ошибке «Не найден сеанс для текущего потока» при выполнении всех моих интеграционных тестов с помощью команды Gradle «integraTest».

У меня есть несколько тестов интеграции сервисов, которые работают самостоятельно. Точно так же у меня есть тесты GEB, которые проводятся без неудачных тестов. Однако, когда я включаю выполнение тестов GEB в сервисные тесты, любые сервисные тесты, которые происходят после тестов GEB, завершаются с ошибкой «org.hibernate.HibernateException: не найден сеанс для текущего потока». Сервисные тесты, которые выполняются перед тестами GEB, проходят без проблем.

Ниже приведен пример тестов интеграции служб. Ошибка выдается при попытке сохранения первого объекта в базе данных.

@Rollback
@Integration
class AppUserServiceSpec extends Specification {

    //--uses Test database
    @Autowired AppUserService appUserService
    SessionFactory sessionFactory


    private AppUser setupData(){
        //--data rolled back after each test
        AppUser appUser = new AppUser(username: 'a', firstName: 'a', lastName: 'a', enabled: true).save(flush: true, failOnError: true)
        new AppUser(username: 'b', firstName: 'b', lastName: 'b', enabled: true).save(flush: true, failOnError: true)
        new AppUser(username: 'c', firstName: 'c', lastName: 'c', enabled: true).save(flush: true, failOnError: true)
        new AppUser(username: 'd', firstName: 'd', lastName: 'd', enabled: true).save(flush: true, failOnError: true)
        new AppUser(username: 'e', firstName: 'e', lastName: 'e', enabled: true).save(flush: true, failOnError: true)

        return appUser
    }


    void "Test something"() {
        given:
        setupData()

        //--test stuff here
    }

Я подозреваю, что это связано с тем, что тесты запускали приложение дважды: один раз для первого регулярного интеграционного теста и снова для первого теста GEB.

Testing started at 3:48 PM ...
3:48:24 PM: Executing task 'integrationTest --tests *.*'...

:compileJava NO-SOURCE
:compileGroovy
:buildProperties
:processResources
:classes
:configureChromeDriverBinary SKIPPED
:configureGeckoDriverBinary SKIPPED
:compileTestJava NO-SOURCE
:compileTestGroovy
:processTestResources NO-SOURCE
:testClasses
:compileIntegrationTestJava NO-SOURCE
:compileIntegrationTestGroovy
:processIntegrationTestResources
:integrationTestClasses
:integrationTest
2019-01-07 15:48:43.048  INFO My Application 2019-01-07 15:48:43.048  INFO My Application 
Configuring Spring Security Core ...
... finished configuring Spring Security Core


Configuring Spring Security LDAP ...
... finished configuring Spring Security LDAP

2019-01-07 15:48:54.065  INFO My Application Grails application running at http://localhost:51962/application in environment: test
2019-01-07 15:48:54.706  INFO My Application 2019-01-07 15:48:54.706  INFO My Application 
Configuring Spring Security Core ...
... finished configuring Spring Security Core


Configuring Spring Security LDAP ...
... finished configuring Spring Security LDAP

2019-01-07 15:48:57.847  INFO My Application Grails application running at http://localhost:51969/application in environment: test
Started InternetExplorerDriver server (32-bit)
2.47.0.0
Listening on port 36464

No Session found for current thread
org.hibernate.HibernateException: No Session found for current thread

1 Ответ

0 голосов
/ 09 января 2019

Попробуйте получить текущий сеанс, который также должен создать новый сеанс, если он не существует:

private AppUser setupData(){
        def currentSession = SessionFactory.getCurrentSession()
                AppUser appUser = new AppUser(username: 'a', firstName: 'a', lastName: 'a', enabled: true).save(flush: true, failOnError: true)
                new AppUser(username: 'b', firstName: 'b', lastName: 'b', enabled: true).save(flush: true, failOnError: true)
                new AppUser(username: 'c', firstName: 'c', lastName: 'c', enabled: true).save(flush: true, failOnError: true)
                new AppUser(username: 'd', firstName: 'd', lastName: 'd', enabled: true).save(flush: true, failOnError: true)
                new AppUser(username: 'e', firstName: 'e', lastName: 'e', enabled: true).save(flush: true, failOnError: true)
        currentSession.flush()
        return appUser
}
...