2014-03-31 50 views
0

我需要單元測試幾種類似於以下方法的方法。 ProductItem類是複雜的,它是嵌套的。測試此方法的一種方法是,我花時間爲ProductItem構建一個對象並將其傳遞給該方法,但我覺得它太乏味了。有沒有什麼好的方法來測試它,而不是構建整個對象?複雜對象依賴的單元測試

public BigDecimal getSubtotal(ProductItem ip) { 
    return ip.getTotal().subtract(ip.getTotalTax()) 
      .subtract(ip.getShipping()); 
} 

回答

2

您可以使用一個模擬庫,如Mockito。例如:

final ProductItem mock = mock(ProductItem.class); 
when(mock.getTotal()).thenReturn(something); 
// same for .getTotalTax(), .getShipping() 

然後你就可以測試你的.getSubtotal()方法:

// Using BigDecimal's .compareTo() for reliable results... 
// "0" and "0.0" are not .equals() with BigDecimal! 
assertTrue(xxx.getSubtotal(mock).compareTo(expectedResult) == 0); 

請注意,您不存根這樣將返回默認值的方法:0元,空對象和假的布爾值。

注2:要求ProductItemfinal和你存根方法不final要麼;否則你將不得不使用PowerMockito並且必須寫出相當多的膠水......

注3:適用於抽象類和接口;你可以mock(Comparator.class)例如

+0

爲什麼我們在這裏使用final來模擬? – user3123690

+0

不確定你在這裏稱之爲狀態測試嗎? – fge

+0

@ user3123690至於'final',那麼,這是我的編碼風格,沒有別的;) – fge