2014-12-04 43 views
3

我需要幫助Spock測試。 我想存根域對象的動態查找程序(findById)。 我不能使用如下代碼:因爲我用的是findsById方法測試的另一部分,如果我使用,我得到誤報Stub動態查找器使用spock

ObjectDomain.metaClass.static.findById = { -> new ObjectDomain()} 

任何人都知道使用Spock存根動態查找器的最佳方式?

在此先感謝。

+0

爲什麼你使用'findById'?除非你使用Hibernate過濾器,否則你應該使用'get()' - 這是相同的查詢,但更加智能緩存 – 2014-12-04 09:59:36

+0

嗨@BurtBeckwith,我使用這個代碼:'def ticket = Entrada.findById(ticketId,[fetch:[ 'tipo':'join','tipo.evento':'join'],readOnly:true])'我想將存根調用到findById – xala3pa 2014-12-04 10:10:55

+0

對,指定fetch或lazy:false需要一個finder。請注意,如果您只使用readOnly:true,那麼調用將等同於'Entrada.read(ticketId)' – 2014-12-04 10:17:39

回答

6

參數號和類型必須在您的元類方法和實際方法之間匹配。您添加了一個無參數findById()方法,但您正在調用具有ID和Map的重載方法。所以你需要改變閉合參數以匹配:

ObjectDomain.metaClass.static.findById = { id, Map args -> new ObjectDomain()} 
+0

hi @BurtBeckwith,首先,感謝您花時間回答我的問題。 我的問題是,我不希望所有我的**功能方法**有這種行爲,我想在某些情況下返回一個對象域,而在其他情況下,一個空。有可能不使用**元類**來保留這種行爲? – xala3pa 2014-12-04 10:41:34

+0

當然 - 檢查該值是否爲映射的id和/或內容,並根據調用該方法的方式返回實例或null – 2014-12-04 10:49:35

+0

如何使用[ConfineMetaClassChanges](http://www.intelligrape.com/博客/ spock-confinemetaclasschanges-annotation-made-writing-grails-unit-test-easily /)Spock中的註釋?我從來沒有用過它,但我已經多次閱讀過它,它似乎可以應用於單個方法。 – 2014-12-04 10:53:28