2013-11-04 138 views
1

我有以下類,並且我測試了方法1,方法2和方法3被模擬。我只測試如下的案例: *如果method2調用OK然後==> OK * if method2 throws NotFoundException and method3 returns OK ==> OK * if method2 throws NotFoundException and method3 throws ServiceException ==> ServiceException確實拋出爲從同一類調用方法的方法編寫測試

爲了測試method1的功能,可以模擬方法method2和method3嗎?我還爲method2和method3添加了單獨的測試,所以我知道他們正在全力工作。

class ClassUnderTest { 

public void method1() { 
    try { 
    method2(); 
    } catch (NotFoundException e) { 
    method3() 
    } 
} 

public void method2() throws NotFoundException { 
    ... 
} 

public void method3() throws ServiceException { 
    ... 
} 

} 
+0

部分模擬應謹慎使用。它可能會導致設計不佳。一般來說,你應該測試行爲,而不是實現。你可以在這裏找到更多的解釋:http://stackoverflow.com/questions/18430915/partial-mocks-are-bad-why-exactly – ziollek

回答

0

這取決於您要給測試的粒度。

爲了使測試用例更容易編寫,一個約定可能只是模擬其他類的方法,但在某些情況下,也許你必須爲同一類的方法編寫模擬,例如,如果你想模擬方法2中的錯誤,可以嘲笑它。

總是你應該儘量保持你的測試儘可能簡單。

1

你可以使用Mockito spy做你的建議,它可以讓你存儲一些方法而不是其他方法。但是,這往往不是最好的事情。原因是這樣的。

任何排序方法的測試應該測試該方法的行爲 - 它是什麼輸出,它的副作用是什麼,以及是否有任何特殊的行爲因輸入的變化。你的測試真的不應該關心方法的實現是什麼,只要它有正確的行爲。因此,儘管method1調用method2method3,但它不是該類實現的要求。因此,與其斷言method1調用method2一個測試,你對method1測試不應該提及method2不惜一切 - 它應該只是檢查輸出和/或method1副作用是他們應該做的是。

這確實意味着您可能在method1的測試與method2的測試之間存在一些重複的斷言,但平衡是因爲您的測試對於實施的更改會很有力。

相關問題