我们有一个扩展 BasicDataSource 的自定义数据源。我们已经覆盖了 getConnection 方法,该方法在其中执行了一些操作。当我们在测试之外运行 webapp 时,当我们从 Controller 调用服务时,它将获取一个新连接并使用该连接,直到服务完成。一切都很好。然而,在集成测试中,连接似乎在测试甚至调用 Controller 之前就被抓取了。下面的流程
定期运行:
调用 Controller -> Controller 调用服务方法 -> 连接被抓取 -> 服务方法运行并返回 Controller
集成测试:
连接被抓取 -> 从测试中调用 Controller -> Controller 调用服务方法 -> 服务方法运行并返回 Controller
不用说,这给我们带来了问题,因为正确的连接对我们的应用程序非常重要。想法?
编辑:仍然遇到重大问题。我们已经到了必须避免创建集成测试或进行一些手动连接切换的地步(这使测试失败了一半)
数据源.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'
}
最佳答案
这不是最终答案,但我相信这是对正在发生的事情的解释:
建议 :
您可以尝试将您的集成测试类设置为 'transaction=false' 并查看 getConnection() 是否在开始时没有被调用!
转到 here 中的“交易”部分看更多!
只是不要忘记,在您的测试中,您将不得不回滚您的交易!如果您设置交易=假。
关于Grails Connections 在集成测试中表现非常不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7040359/