2015-12-08 53 views
1

我有一個要求,其中,我將有兩個類來處理兩個存儲庫,說GitSvn。這兩個倉庫的操作將是相同的:如何設計接口以便在Java中進行簡單的測試?

  1. 獲取分支
  2. 獲得提交IDS
  3. 獲取最後一次提交的文件

我想我可以設計一個界面其中涵蓋了這些操作:

interface Repo{ 
    public JSONObject getBranches() 
    public JSONObject getCommits() 
    . . . . 
} 

現在類GitSvn可以實現Repo。一切都很好。

但問題來了,我們將如何測試這些接口?因爲與回購的連接在相應的類別GitSvn(例如在其構造函數中說明)中處理。因此,它看起來像

class Git implements Repo { 
    public Git(String url, String username, String password){ 
     //connect to git url 
    } 

    . . . 
} 

現在,這是一個公平的設計相對於接口(在測試方面),或我們需要移動創建與回購連接的邏輯說其他類像RepoFactory和它們注入方法params?這樣Repo接口看起來像:

interface Repo{ 
    public JSONObject getBranches(RepoFactory repo) 
    public JSONObject getCommits(RepoFactory repo) 
    . . . . 
} 

,我們可以輕鬆檢測注入的RepoFactory嘲諷。

哪個會更好?還是別的比這兩個更好?

+0

爲什麼不做一個測試方法,它接受'Repo'並簡單地創建一個你想測試的'Repo'的實例? – MadProgrammer

+0

@MadProgrammer:我沒有那麼做 –

+0

爲什麼不寫一個期待''Repo''('public static void test(Repo repo)')的測試方法,那麼它傳遞給它的實例無關緊要,'test(new Git());'?? – MadProgrammer

回答

1

爲什麼你需要測試界面?我認爲你必須測試你的repo的實現:Git和SVN。如果你需要測試更高級的邏輯,你可以使用定製的MockRepo實現來返回模擬值,或者使用像Moq框架這樣的特殊框架來設置這個模擬。

祝你好運!

0

這取決於你想要測試什麼。

比方說你有一個類A依賴B類取決於框架類上。

現在,如果是你的被測單元然後創建一個嘲笑乙假冒根據給定的情景窺探的結果,而對於穩健性檢驗A。

如果你想測試B,則它變得棘手,你應該問自己一個問題。 B是否有任何邏輯和值得測試的部分?如果是這樣,它們應該被提取到不同的類並單獨進行測試,或者您可以用接口包裝框架對象,然後它與A相同。

示例1:B正在從框架讀取字節流連接對象並將它們傳遞給第三方JSON解析器並將結果返回給A.實際上不需要測試B,因爲它只將操作委託給(希望)已經測試過的組件。

示例2:B正在從框架連接對象中讀取一串字節,並且出於效率原因自身將它們解析爲一個JSON對象,然後將結果返回給A.那麼很顯然,如果您引入了JSON解析器,創建並測試執行情況,然後情況變得與示例1中的完全相同。

但是可以說,對於某些(愚蠢和錯誤)的原因,您希望B成爲解析字節的組件。在這種情況下,你別無選擇,只能在框架連接對象上創建一個包裝接口,並模擬它返回所需的輸出。這種方法存在的問題是對一個永遠不會有一個以上實現的組件的不必要的抽象,並且對B沒有明確的責任(SRP)。

然而,有似乎是在您的介紹一個設計缺陷:我不知道你的系統要求,但這個接口絕不允許庫不支持JSON,這似乎離我的,我會建議用明確定義的POJO替換它。如果你肯定在JSON中的使用永遠是真的,那麼你應該這樣做!但是,如果你堅持,那麼至少要確保返回類型是你的JSON定義而不是一些第三方對象。

在這兩種情況下,我都會使用明確定義的非耦合POJO作爲單個抽象層次,如下所示。

interface Repo { 
    public List<Branch> getBranches(); 
    public List<Commit> getCommits(); 
    . . . . 
} 

接口Branch和Commit可以很容易地通過JSON元素實現。

相關問題