Grails连接在集成测试中的表现非常不同

Grails连接在集成测试中的表现非常不同,grails,connection,datasource,integration-testing,Grails,Connection,Datasource,Integration Testing,我们有一个扩展BasicDataSource的自定义数据源。我们已经重写了getConnection方法,该方法在其内部执行一些操作。当我们在测试之外运行webapp时,当我们从控制器调用服务时,它将获取一个新连接并使用该连接,直到服务完成。一切都很好。然而,在集成测试中,连接似乎在测试调用控制器之前就被抓取了。下流 定期跑步: 调用控制器->控制器调用服务方法->连接被抓取->服务方法运行并返回控制器 集成测试: 连接被抓取->从测试调用控制器->控制器调用服务方法->服务方法运行并返回控制器

我们有一个扩展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'
}

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

  • 作为Web应用程序运行:您的服务类有一个transactionManager,它有一个sessionFactory,可以获取连接!因此,在本例中,假设您的服务是“transactional=true”,那么您在服务中调用的所有方法都将在方法的开头有一个“Session.beginTransaction()”(当您设置“transactional=true”时,有一个Grails的代理来做这件事),它将调用所有堆栈,直到getConnection()

  • 以集成测试的方式运行:由于Grails不会提交您的DB更改,所以它总是回滚它们!我相信,当您开始集成测试时,grails会立即创建一个事务!因此,它将能够在以后回滚它!(这是完全有道理的!),你可以通过查看课程来确认这一点。在集成测试中,在服务之前调用init()方法。所以,这就是为什么要先调用getConnection()

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

您是否正在实现ControllerUnitTestCase?还是仅仅是单元测试案例?!你能发布你的DataSource.groovy文件吗?好的,但我的意思是你应该在spring文件(resources.groovy)中注入新的DataSource实现,你是怎么做到的?!您是否也在强制将该数据源注入服务!?作为资源的一部分,我们正在创建一个数据源bean。因此,如果有意义的话,它最终将成为bean={…dataSource(CustomDataSource){…}。问题是,它在作为webapp运行时工作得非常好,但仅仅在集成测试中就失败了。在集成测试中,getConnection调用好像没有在适当的时间完成。我今天晚些时候有时间的时候一定会尝试一下。对不起,我一直在忙bug。希望我今天有时间:)这似乎是正在发生的事情的问题。因为它已经有了一个连接,所以它不会尝试获取一个新的连接。非常感谢你的帮助。