2013-08-01 50 views
1

我有有一個吸氣這樣的類時,不知道如何嘲笑類作品。我嘲笑了crudRepository總是回來一隻固定的動物。我也嘲笑了assetRepository並在我想測試的類上設置模擬庫。但是,我不明白它是如何工作的,爲什麼在調用attachAssets方法時不能獲得空指針和錯誤?它有返回類型void。我的意思是,在attachAssets方法中,我使用了我從未創建過的東西(會話等)。 Mockito是否會自動捕獲異常或是什麼,對於void方法還是什麼?換句話說,我並沒有剔除assetRepositoryattachAssets方法,爲什麼它不會失敗(或者它應該失敗,我不知道)?調用方法

回答

1

模擬是一個虛擬的實現。它是mocked類的一個子類,覆蓋了它的所有方法,並用alomst替換它們的實現(即它返回你告訴它返回的內容,拋出你告訴它拋出的內容,並記錄調用以便能夠在)。

下面是一些例子類:

public class AssetRepository { 
    public void attachAssets(Animal a) { 
     // some real implementation 
    } 
} 

而這裏通過的Mockito創建一個模擬實現的一個簡單的例子:

public class MockAssetRepository extends AssetRepository { 
    private List<Invocation> invocations = new ArrayList<>(); 

    @Override 
    public void attachAssets(Animal a) { 
     // store the invocation to be able to chack if it has been called, 
     // how many times, etc. 
     invocations.add(new Invocation("attachAssets", a); 
    } 
} 

你看,不管你的實現是,它不叫,因爲attachAssets ()在模擬中被覆蓋。

+0

當然,這是有道理的。謝謝:) – LuckyLuke

1

如果您嘲笑AssetRepository,則在模擬上調用方法,並且實際執行無關緊要。相反,Mockito使用該方法的虛擬版本(它什麼都不做)。

Mockito的默認行爲,如果你還沒有告訴它什麼是不做任何事或返回null/0,無論哪個適當。如果你告訴它,它通常只會拋出異常。其他嘲笑框架可能會抱怨,如果你調用一些意想不到的方法。

+0

啊,所以當你模擬時有空方法,並且其他返回類型的方法返回API中指定的默認值? – LuckyLuke

+0

請注意,模擬方法的「默認」返回值不總是0,false或null。它也可以是一個空集合,「」或1,在某些情況下。檢查文檔以獲取更多詳細信息。 –