2016-05-06 38 views
1

我已經看到了Spock測試,其中模擬連線&配置在given塊(這對我來說最合適),以及只有這樣才能獲得該測試通過要求我在then塊內連線/配置模擬,這對我來說簡直是愚蠢的。後者的一個例子是that I asked some time agoSpock塊模擬和在哪裏接線

於是我問:是什麼決定其中實際上線/配置一個模擬,無論是在giventhen我真的希望答案不只是「繼續玩,直到它工作」,因爲這對我的小機器人大腦來說太不確定。

+0

你可以改變這個問題的標題,所以它押韻更多? – Kritner

+0

這是故意的:-) – smeeb

回答

2

如果您打算在多個測試中使用它們並希望減少樣板,則應該在setup/given區塊或甚至在setup()方法中實例化Mocks和Stub。

在我看來,Mocks和Stubs行爲應該定義在最有意義的範圍內。 then通常是最有意義的,但定義您並不真正關心檢查的一般行爲可以放在setup/given區塊或甚至setup()方法中。

+0

感謝@Jon Peterson(+1) - 我(恭敬地)不同意'then'最有意義,但這是我現在不感興趣的主觀論點! **然而**,正如上面提供的鏈接所表明的那樣,''given''內部的接線/配置模擬根本不起作用*。而我的問題是**是什麼驅使了這個?**意思是,在什麼情況下將'給定'中的接線/配置模擬工作,以及何時必須在'then'中完成?再次感謝! – smeeb

+1

在另一個問題中,我相信如果你在'given'塊中使用'fizz1.getProperty('name')'而不是'fizz1.name',那麼它也可以工作。 –

+1

您對Spock的「反直覺」本質感到困惑的根源可能在於您對其他Java嘲諷框架的體驗。 Spock正在做一些事情,在'when'塊之前的'then'塊中調用期望值。附上一個調試器,你會看到調用順序。當我使用非Spock模擬(例如Camel MockEndpoints)時,我通常使用'expect'模塊而不是'when' /'then',這樣我就可以手動排序我期望的方式。 –