java - 如何测试事务数据库代码?

标签 java grails groovy transactions spock

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

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

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

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

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

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

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

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

最佳答案

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

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 中测试

关于java - 如何测试事务数据库代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31218121/

相关文章:

hibernate - 渴望在 grails 中获取整个对象树

java - 在 fragment 而不是 main 中有按钮操作

java - 嵌套循环打印一个数字,旁边有相同数量的星号

java - 让 Java 应用程序在 Windows 上看起来是原生的 - 如何?

groovy - Geb 的一般问题(StaleElementReferenceException 和等待超时)

javascript - 如何通过 REST API 提交 Jenkins 作业?

reflection - 字段前的 Groovy @ 符号

java - JSP 表单输入最大长度不适用于数字类型

grails - Intellij 不显示常规方法的自动完成

grails - 是否有 Grails 域对象的禁止方法名称列表?