2012-02-10 96 views
31

對於單元測試,我需要模擬幾個依賴關係。一個的依賴關係是實現一個接口的類:嘲笑一個類與嘲弄它的接口

public class DataAccessImpl implements DataAccess { 
    ... 
} 

我需要設置這個類當與一些指定的參數提供它返回一些指定值的模擬對象。

現在,我不知道的是,如果它是更好地嘲笑接口或類,即

DataAccess client = mock(DataAccess.class); 

DataAccess client = mock(DataAccessImpl.class); 

它使在任何方面的差異測試?什麼是首選方法?

+1

下面是關於嘲笑類的一些其他想法。尼斯讀,恕我直言:http://stackoverflow.com/questions/1595166/why-is-it-so-bad-to-mock-classes – guerda 2012-02-10 10:56:00

回答

38

它可能沒有太大的差別在你的情況,但首選的方法是模擬接口,因爲通常如果你遵循TDD(測試驅動開發),那麼你寫你的實現類,甚至之前,你可以寫你的單元測試。因此,即使你沒有具體的類DataAccessImpl,你仍然可以使用你的接口DataAccess編寫單元測試。

而且嘲弄框架有嘲諷類的限制,以及一些框架默認情況下只模擬接口。

6

這取決於。如果你的代碼依賴於類而不是在接口上,你必須嘲笑類來編寫有效的單元測試。

+13

還是聽測試,使代碼依賴於一個界面上,因爲它可能應該。 – blank 2012-02-10 11:26:11

6

在大多數情況下,技術上是沒有區別的,你可以爲類嘲笑這樣的接口。從概念上講,更好的抽象使用接口。

2

如果您僅通過接口使用它,它不是一個局部的模擬,還有比你內心感覺等沒有什麼區別。如果班上有他們,嘲笑班級也會模擬未使用的公共方法,但這並不是一個大問題。

3

你應該嘲笑接口,因爲這將有助於確保您遵守Liskov替換校長(https://stackoverflow.com/a/56904/3571100)。

+0

知道這很有趣,如何通過模擬界面來實現這一點?我可以嘲笑界面,但在課堂實施中,我可以違反Liskov替代。 – karlihnos 2017-08-02 15:16:51

+0

@karlihnos我提供的鏈接狀態「函數必須能夠在不知道它的情況下使用派生類的對象。」換句話說,我們應該編程到接口而不是實現。所以在被測試的類中,我們可以通過編程到接口來幫助實現LSP。當然,這樣做並沒有說明任何模擬接口實現是否遵守LSP。 – jordan 2018-01-13 17:34:09