2011-08-12 20 views
6

我们有一个自定义数据源来扩展BasicDataSource。我们已经重写了getConnection方法,它在里面做了一些事情。当我们在测试之外运行webapp时,当我们从控制器调用服务时,它将获取一个新的连接并使用该连接,直到服务完成。一切都很好。但是,在集成测试中,连接似乎在测试甚至调用控制器之前被抓取。流量之下集成测试中Grails Connections的行为非常不同

正常运行: 呼叫控制器 - >控制器调用服务方法 - >连接抓起 - >运行服务方法,并返回到控制器

集成测试: 连接抓起 - >呼叫从测试控制器 - >控制器调用服务方法 - >服务方法运行并返回到控制器

不用说,这给我们带来了问题,因为正确的连接对我们的应用程序非常重要。思考?

编辑:仍然有这个重大的问题。我们已经到了一个地步,我们必须避免造成集成测试,或者做一些手动连接切换(这违背了测试的一半点)

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' 
} 
+0

是你在实现ControllerUnitTestCase吗?或者只是UnitTestCase? –

+0

ControllerUnitTestCase – Joseph

+0

您可以发布您的DataSource.groovy文件吗? –

回答

2

这是不是最后的答案,但是我相信这是发生了什么事的解释:

  • 运行为Web应用程序:你的服务类有有一个SessionFactory,其获取连接的transactionManager的!所以在这种情况下,假设你的服务是'transactional = true',你在服务中调用的所有方法都会在方法开始时有一个'Session.beginTransaction()'(有一个Grails的代理服务器可以做到这一点,当你设置'transactional = true'),它将调用所有的堆栈直到getConnection()。

  • 作为集成测试运行:由于Grails没有提交您的数据库更改,它总是将它们回滚!我相信,当你开始你的集成测试时,Grails正在创建一个交易!所以它将能够在之后回滚!(这使得完全正确!),你可以确认看看类org.codehaus.groovy.grails.test.support.GrailsTestInterceptor。 init()方法在集成测试中的服务之前调用。所以这就是getConnection()在一切之前被调用的原因!

建议: 你可以尝试设置你的集成测试类为“交易=假”,看看是否的getConnection()没有得到在一开始叫! 转到here的交易部分以查看更多! 只是不要忘记,在你的测试中,你将不得不回滚你的交易!如果你的set transaction = false。

+1

今天晚些时候我肯定会试一试,当我得到时间。 – Joseph

+0

对不起,我一直在忙于bug。希望我今天有时间:) – Joseph

+0

这似乎是发生了什么问题。由于它已经有一个连接,它不会尝试抓住一个新的连接。谢谢你的帮忙。 – Joseph