由於我的應用程序域的數據結構到最近變得非常複雜,我開始閱讀模擬對象。很快出現了一個簡單的問題,但迄今爲止,答案已經證明是相當頭痛的。所以這裏有雲:如何在單元測試中使用模擬手法避免誤報?
我們有一類「富」與「酒吧」作爲其中的一個方法:
class Foo {
public String bar(int i){
if(i == 1) return "arrr!";
}
}
而且我們有一個類海盜調用Foo.bar(1);在其中的一個方法:
class Pirate {
public String yell(){
Foo foo = new Foo();
return foo.bar(1);
}
現在我們嘲笑Foo類的海盜類的單元測試,因爲富恰好有其他依賴過多:
@Test
public void returnsPirateString() {
Pirate blackBeard = new Pirate();
Foo fooMock = mock(Foo.class);
fooMock.expectAndReturn("bar",1,"arrr!"); //expects 'bar' function to be called once and returns "arrr!"
assertEquals(blackBeard.yell(),"arrr!");
}
現在會發生什麼,是如果我們重構方法欄來返回null而不是「arrr!」,我們的測試將繼續愉快地運行,而我們的程序不能按照我們想要的方式工作。這可能會導致可能的調試噩夢。
使用mockist方法而不是單元測試的經典測試方法,大多數時候所有「helper」對象都會被嘲笑,只有被測試的對象纔會被解除鎖定,所以前面提到的問題也會經常發生。
可以做什麼來防止這個問題,而嘲笑?
是的,但是這有點不利於嘲笑的使用,因爲無論如何你必須創建你的數據結構來進行不同的測試。在這種情況下,我可以創建一個Object母體,並在這兩個測試中使用這個母親而不是嘲笑。 – tmetten 2010-09-30 14:45:02
我不確定我是否遵循...嘲諷的要點是單獨測試您的不同類,以便您可以專注於測試受測試的特定類。在測試幫助者時,你應該測試那個幫助者與其他真正的類完全隔離。 – Pete 2010-09-30 15:06:18
是的,通過這樣做,你的測試不會指出任何問題,而實際上課程會失敗。 – tmetten 2010-09-30 15:17:10