2017-07-03 78 views
1

我發現從書以下測試針對的Mockito春正確的Mockito使用時磕碰的方法有返回值

import com.packt.trading.dto.Stock; 
import static org.junit.Assert.assertNotNull; 
import static org.mockito.Matchers.anyString; 
import static org.mockito.Matchers.isA; 
import static org.mockito.Mockito.verify; 
import static org.mockito.Mockito.when; 
@RunWith(MockitoJUnitRunner.class) 
public class StockBrokerTest { 
@Mock MarketWatcher marketWatcher; 
@Mock Portfolio portfolio; 
StockBroker broker; 
@Before public void setUp() { 
broker = new StockBroker(marketWatcher); 
} 
@Test 
public void when_ten_percent_gain_then_the_stock_is_sold() { 
//Portfolio's getAvgPrice is stubbed to return $10.00 

when(portfolio.getAvgPrice(isA(Stock.class))).thenReturn(new BigDecimal("10.00")); 

verify(portfolio.getAvgPrice(isA(Stock.class))) 

//A stock object is created with current price $11.20 

Stock aCorp = new Stock("A", "A Corp", new BigDecimal("11.20")); 

//getQuote method is stubbed to return the stock 

when(marketWatcher.getQuote(anyString())).thenReturn(aCorp); 

//perform method is called, as the stock price increases by 12% the broker should sell the stocks 

broker.perform(portfolio, aCorp); 

//verifying that the broker sold the stocks 

verify(portfolio).sell(aCorp,10); 

} 

public void perform(Portfolio portfolio,Stock stock) { 
    Stock liveStock = market.getQuote(stock.getSymbol()); 
    BigDecimal avgPrice = portfolio.getAvgPrice(stock); 
    BigDecimal priceGained = 
    liveStock.getPrice().subtract(avgPrice); 
    BigDecimal percentGain = priceGained.divide(avgPrice); 
    if(percentGain.compareTo(LIMIT) > 0) { 
    portfolio.sell(stock, 10); 
    }else if(percentGain.compareTo(LIMIT) < 0){ 
    portfolio.buy(stock); 
    } 
} 

我叫

when(portfolio.getAvgPrice(isA(Stock.class))).thenReturn(new BigDecimal("10.00")); 

但沒有驗證使用驗證聲明getAvgPrice()被調用或不。 另外我在測試用例中沒有進一步使用返回值。

我們是否應該僅在測試用例中對其返回值進行評估或使用的那些方法進行了存根? 我們不能寫一個沒有verify()或斷言返回值的when()嗎?雖然,在這兩種情況下,我的測試成功運行。

Mockito的使用是否錯誤?

回答

1

當你進行單元測試的方法,請記住:

您正在測試方法爲單位。當您提供所有必需的數據到您的UNIT(方法)時,您必須verify/assert狀態結果是否符合您的期望。

  1. 這裏的期望意味着方法作爲一個單元的正確行爲。
  2. 要提供的數據要麼是輸入形式,要麼是來自相關類別的模擬或存根的形式
  3. exception方案一樣。當你傳遞錯誤的數據時,預期的結果將是例外。您正在測試異常狀態。

測試用例會成功,因爲它在執行時沒有遇到任何異常行爲。在一般情況下,verifyassert狀態是什麼使單元測試有意義

+0

所以,如果我寫這樣的驗證聲明:驗證(portfolio.getAvgPrice(ISA(Stock.class)))它是罰款還是需要也要聲明返回值? –

+0

完全取決於你的用例。如果通過調用另一個方法(如getAvgPrice(...))來執行'perform()'來執行任何業務邏輯,那麼您可能需要'驗證'該方法調用。但是我沒有看到''getAvgPrice()''執行'verify'的任何用法。如果可能,提供'perform()'執行 –

+0

驗證(portfolio.getAvgPrice(isA(Stock.class)))語句和update()方法。 –