Grails连接在集成测试中的表现非常不同
我们有一个扩展BasicDataSource的自定义数据源。我们已经重写了getConnection方法,该方法在其内部执行一些操作。当我们在测试之外运行webapp时,当我们从控制器调用服务时,它将获取一个新连接并使用该连接,直到服务完成。一切都很好。然而,在集成测试中,连接似乎在测试调用控制器之前就被抓取了。下流 定期跑步: 调用控制器->控制器调用服务方法->连接被抓取->服务方法运行并返回控制器 集成测试: 连接被抓取->从测试调用控制器->控制器调用服务方法->服务方法运行并返回控制器 不用说,这给我们带来了问题,因为正确的连接对我们的应用程序非常重要。想法 编辑:这方面仍然存在重大问题。我们已经到了必须避免创建集成测试的地步,或者进行一些手动连接切换(这会破坏测试的一半) DataSource.groovyGrails连接在集成测试中的表现非常不同,grails,connection,datasource,integration-testing,Grails,Connection,Datasource,Integration Testing,我们有一个扩展BasicDataSource的自定义数据源。我们已经重写了getConnection方法,该方法在其内部执行一些操作。当我们在测试之外运行webapp时,当我们从控制器调用服务时,它将获取一个新连接并使用该连接,直到服务完成。一切都很好。然而,在集成测试中,连接似乎在测试调用控制器之前就被抓取了。下流 定期跑步: 调用控制器->控制器调用服务方法->连接被抓取->服务方法运行并返回控制器 集成测试: 连接被抓取->从测试调用控制器->控制器调用服务方法->服务方法运行并返回控制器
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'
}
这不是一个最终的答案,但我相信这是对正在发生的事情的解释:
- 作为Web应用程序运行:您的服务类有一个transactionManager,它有一个sessionFactory,可以获取连接!因此,在本例中,假设您的服务是“transactional=true”,那么您在服务中调用的所有方法都将在方法的开头有一个“Session.beginTransaction()”(当您设置“transactional=true”时,有一个Grails的代理来做这件事),它将调用所有堆栈,直到getConnection()
- 以集成测试的方式运行:由于Grails不会提交您的DB更改,所以它总是回滚它们!我相信,当您开始集成测试时,grails会立即创建一个事务!因此,它将能够在以后回滚它!(这是完全有道理的!),你可以通过查看课程来确认这一点。在集成测试中,在服务之前调用init()方法。所以,这就是为什么要先调用getConnection()
只是不要忘记,在测试中,您必须回滚事务!如果设置事务=false。您是否正在实现ControllerUnitTestCase?还是仅仅是单元测试案例?!你能发布你的DataSource.groovy文件吗?好的,但我的意思是你应该在spring文件(resources.groovy)中注入新的DataSource实现,你是怎么做到的?!您是否也在强制将该数据源注入服务!?作为资源的一部分,我们正在创建一个数据源bean。因此,如果有意义的话,它最终将成为bean={…dataSource(CustomDataSource){…}。问题是,它在作为webapp运行时工作得非常好,但仅仅在集成测试中就失败了。在集成测试中,getConnection调用好像没有在适当的时间完成。我今天晚些时候有时间的时候一定会尝试一下。对不起,我一直在忙bug。希望我今天有时间:)这似乎是正在发生的事情的问题。因为它已经有了一个连接,所以它不会尝试获取一个新的连接。非常感谢你的帮助。