2015-05-06 44 views
3

簡單地說,我有以下情形:測試afterInsert Grails中

class OwnedRights { 
    static belongsTo = [comp: Competition] 

    @Transactional 
    def afterInsert() { 
     // Erroring out here. 
     Event.findAllByComp(comp).each { event -> 
      // Do something with event. 
     } 
    } 
} 

當我試圖在我的單元測試保存的東西,如下列:

def ownedRights = new OwnedRights(params).save(flush: true, failOnError: true) 

我看到下面的堆棧跟蹤:

java.lang.NullPointerException at org.springframework.transaction.support.TransactionTem (org.codehaus.groovy.grails.orm.support.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:85) at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java: 209) 在org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:194)

這導致我this Jira Issue這表明我沒有在我的測試使用@Mock註釋,但是,我嘲笑所有使用的域類:

@Mock([OwnedRights, Sport, Competition, Event]) 

這是一個包含GORM邏輯的hibernate事件的已知問題嗎?

試圖解決使用的metaClass

我試圖重寫afterInsert()beforeDelete方法:

OwnedRights.metaClass.afterInsert = null; 
OwnedRights.metaClass.beforeDelete = null; 

OwnedRights.metaClass.afterInsert = {}; 
OwnedRights.metaClass.beforeDelete = {}; 

這兩者上都沒有效果結果。如果我註釋掉afterInsert事件,則保存完美。

回答

1

您提到@Mock。這隻能在單元測試中使用,但是不應該嘗試在單元測試中測試事務。

這是一個禁忌。在集成測試中測試交易。他們在允許您實現內存中的GORM實現方面所做的工作非常棒,但交易是數據庫功能。你不能指望內存中的實現(由Map !!支持)像數據庫一樣工作。你正在測試的是單元測試的GORM實現的行爲,而不是你的實際數據庫。所以這個測試在現實世界中是無用的。

+0

我刪除了@Transactional註解。最後,我完全刪除了這些事件並做了一些重構。 – christopher

+0

那麼,沒有更多afterInsert?...無賴。我試圖在afterInsert中測試代碼,並且無法使其工作。 – Philippe

0

我用這個註解(在單元測試文件中)來解決這個問題。

@TestFor(FooBarService) 

是的,它可以測試使用單元測試服務層(但一些GORM方法可能無法使用,這取決於你的Grails版本)