Grails Connections 在集成测试中表现非常不同

标签 grails connection datasource integration-testing

我们有一个扩展 BasicDataSource 的自定义数据源。我们已经覆盖了 getConnection 方法,该方法在其中执行了一些操作。当我们在测试之外运行 webapp 时,当我们从 Controller 调用服务时,它将获取一个新连接并使用该连接,直到服务完成。一切都很好。然而,在集成测试中,连接似乎在测试甚至调用 Controller 之前就被抓取了。下面的流程

定期运行:
调用 Controller -> Controller 调用服务方法 -> 连接被抓取 -> 服务方法运行并返回 Controller

集成测试:
连接被抓取 -> 从测试中调用 Controller -> Controller 调用服务方法 -> 服务方法运行并返回 Controller

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

编辑:仍然遇到重大问题。我们已经到了必须避免创建集成测试或进行一些手动连接切换的地步(这使测试失败了一半)

数据源.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 应用程序运行 :您的 Service 类有一个 transactionManager,它有一个 sessionFactory,它获取连接!因此,在这种情况下,假设您的 Service 是“transactional=true”,您在服务中调用的所有方法都将在方法的开头有一个“Session.beginTransaction()”(有一个 Grails 代理可以做到这一点) ,当您设置 'transactional=true') 时,它将调用所有堆栈,直到 getConnection()。
  • 作为集成测试运行 :由于 Grails 不提交您的数据库更改,它总是回滚它们!我相信当您开始集成测试时,grails 会立即创建一个事务!所以它可以在之后回滚它!(这是完全正确的!),你可以确认看看类 org.codehaus.groovy.grails.test.support.GrailsTestInterceptor . init() 方法在集成测试中的服务之前调用。所以这就是为什么 getConnection() 在一切之前被调用!

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

    关于Grails Connections 在集成测试中表现非常不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7040359/

    相关文章:

    java - Oracle 数据库连接 - 不使用 setUrl

    scala - Groovy Grails 或 Scala Play

    grails - 用于实现类层次结构向下钻取/向上钻取机制的脚手架功能

    grails - 使用域类绑定(bind)在运行时评估 GString

    grails - grails namedQueries如何使用OR

    connection - 打开redis连接太慢

    exception - Hadoop Connect异常

    php - 为什么连接失败时 PDO 会打印我的密码?

    c# - 从使用数据源的列表框中删除和修改所选项目

    c# - DataBindings.Add 使用 IEnumerable<string>