2015-09-26 54 views
0

我有一個方法是這樣的:關閉驗證覆蓋默認嘲諷

public void save(DbSession session,Wrappe wrapper,Wrappe wrappe){ 
     //...other logic 

     //save wrapper 
     wrapper=(Wrapper)session.save(wrapper) 

     //set wrapper's id into wrappee 
     wrappee.setWrapperId(wrapper.getId()); 

     //save wrappee 
     session.save(wrappee); 
} 

和測試代碼如下所示:

given:  
    session.save(_) >> wrapperWithGeneratedId 

    when: 
    obj.save(session,wrapper,wrappee) 

    then:"wrapper got saved" 
    1*session.save(_) >> {Wrapper save -> 
     diffs(wrapper,saved)==null 
    } 
    and:"wrappee" 
    1*session.save(_) >> {Wrappe saved -> 
     diffs(wrappee,saved)==null 
    } 

這些測試代碼會給出一個例外:

java.lang.ClassCastException: java.lang.Boolean cannot be cast to com.company.model.Wrapper 

如果在「然後」部分評論驗證關閉,測試將通過,所以我猜這部分

1*session.save(_) >> {Wrapper save -> 
     diffs(wrapper,saved)==null 
} 

凌駕於這個嘲弄:

session.save(_) >> wrapperWithGeneratedId 

任何方法都做正確?

回答

0

1st。 '和'是句法糖。這只是一種在同一個塊中直觀地分離代碼的方法。你的最後兩個嘲笑實際上是相同的(雖然因爲你正在行爲測試,它仍然會驗證保存被稱爲兩次。)

2nd。假設你想驗證diffs(wrapper,saved)==null,那目前不會發生,因爲它不是「基礎級」評估。如果你想評估它,那麼任何內部/關閉/等等都需要用「assert」作爲前綴。

3rd。一個塊的範圍是它的when塊,並且可以覆蓋現有的mock;你假設你的模擬被覆蓋是正確的。

4th。您是否有任何理由不僅僅將您的回報價值包括在評估中?

2 * session.save(_) >> {Wrapper save -> 
    diffs(wrapper,saved)==null 
    return wrapperWithGeneratedId 
} 

5th。你的錯誤是由於你的模擬返回了一個布爾值(你的斷言邏輯),然後Groovy嘗試(並失敗)解析爲包裝器。我爲什麼發生這種情況的假設是.save()具有返回類型的包裝器。爲了解決這個問題,你要麼需要創建一個包裝布爾構造函數,或者改變你的模擬到Groovy的東西可以變成一個包裝返回(如何做第4點)

Official Stub/Mock/Spy documentation (quite good, worth a read)