Grails Connections 在集成测试中的行为非常不同

Posted

技术标签:

【中文标题】Grails Connections 在集成测试中的行为非常不同【英文标题】:Grails Connections behaving very differently in Integration test 【发布时间】: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 调用。 【参考方案1】:

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

作为 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() 是否在开始时没有被调用! 转到here 中的交易部分以查看更多信息! 只是不要忘记,在您的测试中,您将不得不回滚您的事务!如果您设置的 transaction=false。

【讨论】:

我一定会在今天晚些时候有时间的时候尝试一下。 对不起,我一直在忙于处理错误。希望我今天有时间:) 这似乎是正在发生的事情的问题。由于它已经建立了连接,因此它不会尝试获取新的连接。非常感谢您的帮助。

以上是关于Grails Connections 在集成测试中的行为非常不同的主要内容,如果未能解决你的问题,请参考以下文章

Grails 2.3 迁移脚本不会在集成测试期间运行

Grails 2.0 集成测试污染?

如何在 Grails 2.0 服务中对 i18n 注入 messageSource 的使用进行单元或集成测试

Grails - 在哪里放置测试文件以及如何加载它们

如何使用 @Build 为 grails 集成测试创建多种类型的测试数据

Grails里的集成测试代码试例