Grails Connections在Integration测试中的表现非常不同

Jos*_*eph 6 connection grails integration-testing datasource

我们有一个扩展BasicDataSource的自定义数据源.我们已经重写了getConnection方法,该方法在其中执行了一些操作.当我们在测试之外运行webapp时,当我们从控制器调用服务时,它将获取新连接并使用该连接直到服务完成.一切都很好.但是,在集成测试中,连接似乎在测试甚至调用控制器之前被抓取.流程如下

常规运行:调用控制器 - >控制器调用服务方法 - >连接被抓取 - >运行服务方法并返回控制器

集成测试:抓取连接 - >从测试调用控制器 - >控制器调用服务方法 - >运行服务方法并返回控制器

毋庸置疑,这给我们带来了问题,因为正确的连接对我们的应用非常重要.思考?

编辑:仍然遇到重大问题.我们已经达到了这样的程度,我们必须避免创建集成测试,或者进行一些手动连接切换(这会使测试的一半失败)

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'
}
Run Code Online (Sandbox Code Playgroud)

Art*_*ves 2

这不是最终答案,但我相信这是对正在发生的事情的解释:

  • 作为Web应用程序运行:您的Service类有一个transactionManager,它有一个sessionFactory,它获取连接!因此,在这种情况下,假设您的服务是“transactional=true”,您在服务中调用的所有方法都会在方法的开头有一个“Session.beginTransaction()”(有一个 Grails 代理来执行此操作) ,当您设置“transactional=true”时),这将调用所有堆栈,直到 getConnection()。

  • 作为集成测试运行:由于 Grails 不会提交数据库更改,因此它总是回滚它们!我相信当您开始集成测试时,grails 会立即创建一个事务!所以它之后能够回滚它!(这完全有道理!),您可以通过查看org.codehaus.groovy.grails.test.support.GrailsTestInterceptor类来确认。在集成测试中,在服务之前调用 init() 方法。这就是为什么 getConnection() 在所有事情之前被调用!

建议:您可以尝试将集成测试类设置为“transaction=false”,看看 getConnection() 是否一开始就没有被调用!请前往此处的交易部分查看更多信息!只是不要忘记,在您的测试中您将必须回滚您的事务!如果您设置的交易= false。