grails - 从grails 2.3.4迁移到3.3.8时无法模拟域

标签 grails mocking gorm geb

我有一个称为Provenance的域类,用于标记由应用程序创建的记录与其他创建方法(ETL等)。该记录预先存在于数据库中,并且beforeInsert,beforeUpdate,beforeDelete引发RuntimeException以强制将域设为只读

class Provenance implements Serializable {
    ...
    static Provenance MANUAL() {
        findByProvenanceType('MANUAL')
    }

    def beforeInsert() {
        throw new RuntimeException('create not allowed')
    }
    ...
}

我正在测试一种保存Person(mockDomain)记录的服务方法。我曾这样 mock 过:
given:
def provenance = GroovyMock(Provenance, global: true)
...
when:
def result = service.savePerson(params)
...
then:
1 * Provenance.MANUAL() >> provenance
result.person.provenance == provenance

迁移的主要更改是用于Person域的2.3.4 @Mock和用于3.3.8的 mock 域。

这对于grails 2.3.4来说效果很好。但是,当迁移到grails 3.3.8时,将保存的人级联到Provenance中,这将导致引发beforeInsert中的RuntimeException。

我还考虑过在Provenance上使用mockDomain并事先保存,但我遇到了同样的问题,因为不能重写beforeInsert来防止RuntimeException。关于为什么会在版本之间进行更改以及如何解决的任何想法?

最佳答案

遵循Overriding event closure on Grails GORM domain class for unit testing中ice1080的建议,我将beforeInsert中的逻辑移至另一个方法,并在测试中覆盖该方法以允许在安装过程中创建域

关于grails - 从grails 2.3.4迁移到3.3.8时无法模拟域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53563490/

相关文章:

java - 在 spring 中使用 Autowiring Set 时,如何模拟所有实现相同接口(interface)的类?

python - 我怎样才能模拟一个属性来引发异常?

grails - Grails “deep”条件+一对多关系

grails - 使用参数创建 url,并在其他 gsp 页面 grails groovy 中使用它们

grails - 如何禁用 Grails Controller 的 'allowedMethods' 机制

grails - grails 中独特的随机 token 生成

rest - Grails(未保存)==来自动态查找器的null

tomcat - Grails 应用程序未在 Tomcat 中启动,但没有错误或警告

ionic-framework - Miragejs:无法加载 ionic 图标 - data:image/svg+xml

grails - 当一个的键是另一个的ID时,如何从旧数据库中将一个映射到一个关系