2012-12-03 69 views
1

最近,我一直在閱讀很多關於合同和協作測試的文章(主要來自J.B. Rainsberger)。爲了進入它,我開始了一個小項目。合同測試是否需要暗示存根?

從我的理解,合同測試的責任是確保實施尊重其接口固有合同。換句話說,它鼓勵Liskov替代原則。

嘲諷對象合作者基本上都是關於對對象進行假設。現在,如果這些假設變化會發生什麼?如果我用嘲笑的Mockito這樣的(這涉及到同樣的事情存根)的合作者:

when(collaborator.doSomething(someArgument)).thenReturn(someValue); 

我將無法看到的變化,當我將修改合作者接口(即其合同)。

所以,這裏是我的問題:當僞造一個向被測系統提供間接輸入的合作者時,應該使用存根來防止未被注意的界面/合同改變?

這裏是我已經查了一些鏈接:

removing-the-integration-test-scam-understanding-collaboration-and-contract

writing contract tests in java differently

我希望我足夠清楚,如果沒有,我會盡我所能,使這個更透明。感謝你們所有人提前。

+0

我相信這比程序員更適合於閱讀他們的[faq](http://programmers.stackexchange.com/faq)。 – poplitea

回答

0

存根與嘲is之間存在明顯分離。

存根是一個替身,不能改變測試的結果。例如,傳入主題的輸入參數。

另一方面,模擬可能無法通過測試。它是測試對象之間協作的基礎。如果預期的協作不符合,測試應該失敗。

因此,在你的問題的上下文中,間接輸入到系統應該是存根。

+0

非常感謝,現在更清楚了。 –

+0

必要時它是解釋模擬和存根之間的區別,它只是部分回答問題。 1)mock vs stubs問題與處理契約變更是正交的,mock和stubs會在編譯時檢測到相同的契約修改,2)更微妙的契約變更不會被他們檢測到,所以你必須有其他的一種處理它們的策略。 – guillaume31

0

JB Rainsberger有似乎正是回答你的問題的文章:Who Tests The Contract Tests ?

因此,這裏是我的問題:是不是正確的,僞造的合作者 這下測試提供間接輸入到系統中時,一個應該使用 存根以防止未被注意的界面/合同更改?

使用存根而不是什麼?

Mocks?這並沒有太大的區別,正如@bryanbcook所指出的,無論如何,存根都更適合這種情況。

手動僞造類甚至不與協作者實現相同的基類?當然。

IMO有2種的合同變更:

  • 「硬」的轉變,在你的合作者的方法的返回類型或參數類型即改變。這些修改是很容易的 - 它們不能被忽視,因爲你的測試甚至不會編譯,只要你的假合作者實現與真實合作者相同的接口/基類。

  • 「軟」更改,即協作者返回給定值或其他值的條件發生變化,協作者可以返回或接受的值範圍發生變化,可引發的例外情況等。更難以發現,但根據上述文章,可以通過強制執行合同測試與協作測試之間的嚴格對應來避免它們。

+0

非常有趣的評論。我剛剛閱讀了JB Rainsberger同意的類似文章。基本上,如果你足夠嚴格,不應該需要對每個間接投入進行存根,這是一個平衡的問題。謝謝。 –