我有一个称为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/