【问题标题】:How can you test transactional database code?如何测试事务数据库代码?
【发布时间】:2015-07-04 07:25:13
【问题描述】:

假设您有一些简单的代码,您可以在一个事务中将两行插入数据库。

如何让第二个在测试中失败以检查第一个是否回滚?

它会是一个网络服务吗,我会通过元编程来模拟它,以便让第二次调用失败。

但是对于数据库代码,我不确定。是否有某种 jdbc 驱动程序会为(比如说)每 7 次操作抛出异常?

好的,让我们更具体一点:

假设您有一些遗留代码。它的结构不是很好,但你也不想重构它(让我们先写一些测试!)。事务行为似乎有问题,您想测试您的代码。

由于代码基本上可以正常工作,因此很难使部分代码因违反约束而失败。

所以我想在我的测试中做的是模拟如果数据库发生故障(可能是因为出现死锁、不可用、磁盘已满或类似情况)或当你“拔掉插头”时会发生什么。

【问题讨论】:

  • 我很确定你可以用spock做到这一点
  • 是的,但是如何...找不到示例...
  • 违反了要添加的第二行的某些约束。任何会导致第二次插入失败的东西都应该足够了,不是吗?
  • 我不想测试transcational功能,我想测试我的代码在数据库失败或拔掉插头时的行为。

标签: java grails groovy transactions spock


【解决方案1】:

集成测试是测试事务和回滚的合适场所。像这样的样本就足够了:

package com.example

import grails.test.mixin.integration.Integration
import grails.transaction.*
import spock.lang.*
import org.springframework.beans.factory.annotation.Autowired

@Integration
@Rollback
class TransactionIntSpec extends Specification {

    @Autowired
    FooService service

    void "test transaction rollback"() {
        given: 'bar service throws exception'
        service = Mock(FooService) {
            serviceBar() >> { throw new Exception() }
        }

        when:
        service.serviceMethod()

        then:
        !Foo.count() && !Bar.count()
    }

    void "test transaction successfull"() {
        when:
        service.serviceMethod()

        then:
        Foo.count() && Bar.count()
    }
}

其中FooBar 只是简单的域类,服务类看起来像:

package com.example

import grails.transaction.Transactional

@Transactional
class FooService {

    def serviceMethod() {
        serviceFoo()
        serviceBar()
    }

    def serviceFoo() {
        new Foo().save(flush: true, failOnError: true)
    }

    def serviceBar() {
        new Bar().save(flush: true, failOnError: true)
    }
}

在 Grails 3.0.2 中测试

【讨论】:

  • 好的,这里使用的技巧是将方法/事务拆分为您可以模拟的子方法。因此,如果 serviceFooserviceBar 是内联的,这将不起作用,不是吗?
  • 您可以按照@railsgod 在评论中的建议进行操作。
猜你喜欢
  • 1970-01-01
  • 2014-04-19
  • 2017-11-13
  • 2017-12-15
  • 2016-09-18
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
相关资源
最近更新 更多