【发布时间】:2011-10-25 19:17:19
【问题描述】:
我们有一个扩展 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'
}
【问题讨论】:
-
你在实现 ControllerUnitTestCase 吗?还是只是 UnitTestCase?!
-
您能发布您的 DataSource.groovy 文件吗?
-
好的,但我的意思是你应该在 spring 文件中注入新的数据源实现(resources.groovy),你是怎么做到的?!您是否还强制将该数据源注入服务中!?
-
作为资源的一部分,我们正在创建一个 dataSource bean。因此,如果有意义的话,它最终会成为 beans = { ... dataSource(CustomDataSource){...}}。问题是它在作为 web 应用程序运行时运行良好,但仅在集成测试中就惨遭失败。就像在集成测试中没有在适当的时间完成 getConnection 调用。
标签: grails connection datasource integration-testing