中,Grails GORM域类压倒一切的大事封闭的单元测试(Overriding event clo

2019-08-04 23:59发布

我工作的一个新的Grails项目,并注意到最近在Spring Security的核心默认约定生成用户类现在自动编码通过beforeInsert /更新事件的密码。 这是一个不错的,干净,干燥做编码的方式,并且也使得它不可能忘记这样做。

然而,尝试写一些单元测试,其利用所述用户类的现在时,我发现我要么嘲笑了springSecurityService(由于编码),或更优选(和清洁),我只是覆盖beforeInsert /更新关闭一个,什么也不做。 通常在Groovy一个可以覆盖使用ExpandoMetaClass的方法,阿拉...

User.metaClass.beforeInsert = { /* do nothing */ }  

......但我发现,原来beforeInsert继续在创建并保存新的用户调用。 这反过来又使我的单元测试炸毁。 这是微不足道的,我只是解决这一点,并模拟出该服务,但上面的应该工作 。 我缺少的东西吗? 有没有用,我不是捡格姆的事件闭包不同的东西?

Answer 1:

为了提高性能Grails使用反射直接与高速缓存方法处理用于调用的事件,而不是Groovy的元层。 原因是,如果你是节省数域实例可以严重地伤害性能,如果Grails的必须经过Groovy的每个事件的元层。

这种情况有解决办法,如定义自己的User类,禁止基于系统/环境属性,你的测试集等事件,但目前还没有办法通过覆盖元编程方法。



Answer 2:

所述beforeInsert闭合实际上不仅是像toString()方法或保存(),但也它是由支持的预定义的事件格姆 。 覆盖的方法不会阻止格姆烧制而成的PreInsert事件,导致原本的处理。



Answer 3:

如果必要的话,您可以替换代码beforeInsert有私人的方法,然后重写私有方法



文章来源: Overriding event closure on Grails GORM domain class for unit testing