考慮一個鏈表類,我維護2個私有變量1. firstNode和2. lastNode。這些變量僅用於內部使用,因此不通過getter公開。我想測試操作是否按預期修改這兩個變量。例如:如果最後一個節點是重複的,排除已排序鏈接列表中的重複應該更改最後一個節點。如何測試一個私有變量?
我應該爲單元測試添加一個顯式的getter嗎?
如果不是那麼如何訪問私有未暴露變量的值?
考慮一個鏈表類,我維護2個私有變量1. firstNode和2. lastNode。這些變量僅用於內部使用,因此不通過getter公開。我想測試操作是否按預期修改這兩個變量。例如:如果最後一個節點是重複的,排除已排序鏈接列表中的重複應該更改最後一個節點。如何測試一個私有變量?
我應該爲單元測試添加一個顯式的getter嗎?
如果不是那麼如何訪問私有未暴露變量的值?
如果這些變量未正確更新,請考慮會出現什麼問題(即合同的哪一部分將被違反)。爲此寫一個測試,證明它應該失敗,然後確保它不會失敗。
你可以嘗試使它成爲包級別的獲得者。 get函數不會被暴露,但你仍然可以檢查。
聽起來很合理,但這是典型的行業? – JavaDeveloper
我發現真正的單元測試只在大約一半的公司中完成。那些做單元測試的人,只需很少的手續就可以做到。 Google是我所知道的唯一一個強制進行高質量單元測試的人。通常情況下,代碼編寫者可以自由地爲自己的單元測試做任何事情。 –
我會嘗試放寬訪問修飾符前的其他選項。你應該幾乎不需要那樣做。 – herman
你不應該測試私有變量,只有公開的東西。測試私人數據正在測試非常脆弱的實施細節。如果你想改變你的實現,那些測試會失敗或不再編譯。
而是編寫只測試公共API的測試。在你使用鏈表的例子中,你的測試應該修改列表,然後使用公共方法遍歷結構,從節點到節點,以確保所有節點都是正確的。
+1強調它是應該測試的公共API – herman
不要這樣做。您應該測試鏈接列表的行爲,而不是它的實現。計算出鏈表在各種情況下的行爲方式,並根據其預期行爲推導出測試用例。如果你發現自己編寫的測試用例需要研究類的實現(包括它的私有成員),那麼你的測試實際上並不能確保類的行爲是正確的。
提及*行爲* :) – herman
您應該考慮在公共接口上測試該變量值的* observable effect *。 –
很難從這裏說出你應該做什麼,但需要測試一個私有變量應該意味着你需要改變你的設計。 –
@TonyHopkinson不是真正的恕我直言(並根據經典的TDD做法)。甚至在實施之前,他應該能夠編寫測試。然後,他應該能夠通過快速的實施來進行測試。然後,他應該能夠在不打破測試的情況下改進他的設計。 – herman