2015-03-02 60 views
1

在Java中(在Android特定環境中,但這應該適用於所有板),爲了進行單元測試,刪除private修改器(因此是否爲package)被認爲是不好的做法?爲了測試而製作方法包還是私有方法是不好的做法?

說我有類似如下:

public void init(long id) { 
    mId = id; 
    loadItems(1); 
} 

public void refresh() { 
    loadItems(mId); 
} 

private void loadItems(int page) { 
    // ... do stuff 
} 

在這種情況下,我有絕對應該測試2種公共方法。值得關注的是,refresh()init()方法幾乎相同,減去處理id的一些邏輯。

看起來這會是最簡單寫一個單元測試loadItems(),然後就驗證這兩個init()refresh()呼叫loadItems()與適當的ID(使用類似的Mockito)。儘管如此,測試私有方法並不是一種「好方法」。

這樣做會讓我成爲一個糟糕的軟件開發人員嗎?我知道私人方法在技術上不應該需要單元測試,但這將是一個簡單的測試方法,IMO,尤其是如果loadItems()有點複雜。

+1

也許您現在的課程違反了[單一責任原則](http://en.wikipedia.org/wiki/Single_responsibility_principle)?例如,您可以製作一個專門的'ItemsLoader'類,您可以測試該類,並將該類的(模擬)實例注入當前類。儘管如此,我錯過了一些背景。 – nhaarman 2015-03-02 20:22:04

+1

嗯...我想後續問題可能是「什麼時候創建一個新類過量殺毒軟件?」這顯然有點模糊。你和@kha基本上都是推薦同樣的東西。 – loeschg 2015-03-02 20:38:08

+1

+1。也許(我不確定)如果你可以將它形成一個適當的問題,它可能適合[Programmers SE](programmers.stackexchange.com)。不要忘記首先嚐試搜索功能:) – nhaarman 2015-03-02 20:40:36

回答

4

你加入了「這樣做會使我成爲一個糟糕的軟件開發者嗎?」

我不認爲這會讓你成爲一個糟糕的開發者。例如,如果你看看.NET,他們甚至有辦法允許其他庫爲單元測試目的而查看另一個庫的內部結構(InternalsVisibleTo)。

雖然我個人反對測試私有方法。在我看來,單元測試應該在可見方法而不是私有方法上進行。測試私有方法有點不利於封裝,使得一個方法更加明顯,而僅僅爲了單元測試需要看起來是錯誤的。

如果我是你,我會改爲測試我的公共方法。今天,您的兩種方法幾乎完全相同,通過使包可見來測試私有方法更爲容易。但是,明天可能不再是這種情況。由於這兩種方法都是公開的,並且其他類可以很容易地訪問,所以如果發生這種情況並且兩者分離,您可能會測試錯誤的東西。

更重要的是(這是什麼,我會建議)是移動

private void loadItems(int page) { 
    // ... do stuff 
} 

到自己的類都有自己的接口,然後測試loadItems(int page)一次使用一個單獨的單元測試,然後測試兩個公共方法通過確保他們用你期望的參數調用接口。這樣,你正在測試你的整個代碼,並避免我上面解釋的陷阱。

1

恕我直言,最好有測試比不,如果它使代碼更好,更容易維護,我認爲它是一個好主意。

我也同意Niek在重新把邏輯放在另一個類中。

我還會補充說,該方法是無效的,所以有副作用,我覺得比簡單聲明一個返回值更難測試。

也許考慮像

列表loadItems(INT頁)

然後檢查列表中返回。

相關問題