2013-08-26 360 views
2

考慮一個鏈表類,我維護2個私有變量1. firstNode和2. lastNode。這些變量僅用於內部使用,因此不通過getter公開。我想測試操作是否按預期修改這兩個變量。例如:如果最後一個節點是重複的,排除已排序鏈接列表中的重複應該更改最後一個節點。如何測試一個私有變量?

  1. 我應該爲單元測試添加一個顯式的getter嗎?

  2. 如果不是那麼如何訪問私有未暴露變量的值?

+1

您應該考慮在公共接口上測試該變量值的* observable effect *。 –

+2

很難從這裏說出你應該做什麼,但需要測試一個私有變量應該意味着你需要改變你的設計。 –

+0

@TonyHopkinson不是真正的恕我直言(並根據經典的TDD做法)。甚至在實施之前,他應該能夠編寫測試。然後,他應該能夠通過快速的實施來進行測試。然後,他應該能夠在不打破測試的情況下改進他的設計。 – herman

回答

1
  1. 你不知道。你會將你的測試與你的實現結合起來。如果你要重構你的實現,你應該有信心,如果你的測試不需要修改就可以繼續工作,你不會破壞任何東西。

如果這些變量未正確更新,請考慮會出現什麼問題(即合同的哪一部分將被違反)。爲此寫一個測試,證明它應該失敗,然後確保它不會失敗。

+0

所以不要這樣做,因爲你使用的東西可能會改變,而是以另一種方式做它,正在使用可以改變。 (我不明白爲什麼你不應該測試私人) – puser

+0

@puser你的私有變量可能會改變,而不會改變外部,例如,你只是重構一些代碼。在這種情況下,你不希望必須修復測試。相反,你希望測試能夠提供外部確實有變化的保險。 – herman

+0

感謝您的回覆。通過改變而不改變外部,你的意思是變量的名稱可以改變?如果是這樣,重構可以在你的單元測試中重構對它的引用。如果不是,你能解釋一下你的意思嗎?謝謝 – puser

0

你可以嘗試使它成爲包級別的獲得者。 get函數不會被暴露,但你仍然可以檢查。

+0

聽起來很合理,但這是典型的行業? – JavaDeveloper

+0

我發現真正的單元測試只在大約一半的公司中完成。那些做單元測試的人,只需很少的手續就可以做到。 Google是我所知道的唯一一個強制進行高質量單元測試的人。通常情況下,代碼編寫者可以自由地爲自己的單元測試做任何事情。 –

+0

我會嘗試放寬訪問修飾符前的其他選項。你應該幾乎不需要那樣做。 – herman

3

你不應該測試私有變量,只有公開的東西。測試私人數據正在測試非常脆弱的實施細節。如果你想改變你的實現,那些測試會失敗或不再編譯。

而是編寫只測試公共API的測試。在你使用鏈表的例子中,你的測試應該修改列表,然後使用公共方法遍歷結構,從節點到節點,以確保所有節點都是正確的。

+1

+1強調它是應該測試的公共API – herman

3

不要這樣做。您應該測試鏈接列表的行爲,而不是它的實現。計算出鏈表在各種情況下的行爲方式,並根據其預期行爲推導出測試用例。如果你發現自己編寫的測試用例需要研究類的實現(包括它的私有成員),那麼你的測試實際上並不能確保類的行爲是正確的。

+1

提及*行爲* :) – herman