2009-06-17 136 views
8

對於單元測試目的,我試圖編寫一個沒有構造函數的類的mock object有沒有可能擴展一個沒有Java構造函數的類?

這甚至在Java中可能的是類根本就沒有擴展?

+2

問題是,它可以被嘲笑,不可以被分類,考慮到接受的答案,也許你應該改變這個問題,如果這是你的意思? – Yishai 2009-06-17 14:38:44

+0

我的問題明確詢問可擴展性。它只提到嘲笑作爲希望這種可擴展性的原因。 – 2009-06-17 18:08:53

回答

18

一類沒有構造函數有一個隱含的公共的無參數的構造函數,是的,只要它不是最終的,也可以是子類。

如果類只有私有構造函數則沒有,它不能。

+0

有問題的類只有私有構造函數,包括無參數的構造函數,所以我想我只是運氣不好。 – 2009-06-17 01:05:13

+0

看起來這個類在測試方面不是非常友好。你真的應該使用接口,而不是concerete類型... – 2009-06-17 01:19:03

2

如果java類沒有任何定義的構造函數,那麼對你來說沒有問題。如果類將定義任何構造函數,並且它們都將隱藏給您(私有),則問題將爲此。

0

如果只有私有構造函數,你仍然可以使用,以便反映,以便能夠從類外部訪問它們。

3

已回答問題,但要添加評論。這通常是提出將代碼編寫爲可測試的好時機。

不要做一個關於它的痛苦,研究什麼需要(可能是依賴注入至少),瞭解寫作模擬考試,並提出一套合理的指導方針,允許類更有用。

我們只是重新寫了一堆單身的使用DI,而不是因爲單身是出了名的難嘲笑。

這可能不是一個好,但編碼可測性的某種程度是最專業的店標。

3

是的,你可以嘲笑的對象,雖然它可能不能夠繼承它(當然不是沒有得到非常親密的類加載器,反正)。 Here是你如何使用JMock來完成的。

以這種方式嘲弄可以讓你保持的類型,沒有子雖然它可能會挺難不可能弄清只有某些行爲。因此,此方法適用於測試使用此類的類,而不適用於測試類本身。

如果你實際上可以訪問類的源代碼,你可以實現一個允許你擴展它的內部類,但是如果你可以這樣做的話,你也可以使其中一個構造函數也是私有的。

也有動態語言,這將允許你做的子類,並實現一個Java接口,Java代碼可以交互,但我不那麼熟悉的細節。

1

您可以模擬類,和其任何或所有構造函數,用JMockit

這是一個Java的嘲弄工具包,它可以讓你嘲笑任何事情。 即使該類不公開和/或嵌套,它仍然可以被模擬。 JMockit中有幾種機制可用於此目的。工具箱發行版也包含大量的示例JUnit測試。

如果類實現了某個接口或擴展了一個抽象類,那麼您可以告訴JMockit根據需要「捕獲」並基本類型的模擬實現,因爲它們由JVM加載,甚至將創建的實例分配給測試類中的字段。

相關問題