我正在研究一個新鮮的Grails項目,並且最近注意到Spring Security Core生成的User類中的默認約定現在通過beforeInsert/Update事件自動編碼密碼。這是一種乾淨,乾淨的編碼方式,也使得忘記這麼做成爲不可能。但是,現在當試圖寫一些使用所述User類的單元測試時,我發現我必須模擬springSecurityService(由於編碼),或者更優選地(並且乾淨地),我' d只需重寫beforeInsert/Update閉包,其中一個不執行任何操作。通常在Groovy一個可以覆蓋使用ExpandoMetaClass,鼻翼的方法...Grails GORM領域類的單元測試重寫事件關閉
User.metaClass.beforeInsert = { /* do nothing */ }
...但我發現,原來beforeInsert繼續在創建並保存新的用戶調用。這反過來導致我的單元測試爆炸。對我來說,解決這個問題並嘲笑服務是微不足道的,但上面的應該工作。我錯過了什麼嗎? GORM的事件關閉有什麼不同,我沒有采取?
另外一點需要注意的,我有一個@Mock([用戶])在我的測試註解。這可能與奇怪的行爲有關,但僅僅是一種預感。 – James
是實例上的expando方法嗎? //問它永遠不會太晚:) –
你爲什麼這麼想,那嘲笑springSecurityService並不是這樣做的首選方式?我的意思是,在思考依賴注入時,首先考慮的事情之一就是:外部化依賴管理,因此能夠爲測試目的創建存根/模擬。在我看來,改變用戶的metaClass在任何方面都不是很清楚。 –