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的使用是否錯誤?
所以,如果我寫這樣的驗證聲明:驗證(portfolio.getAvgPrice(ISA(Stock.class)))它是罰款還是需要也要聲明返回值? –
完全取決於你的用例。如果通過調用另一個方法(如getAvgPrice(...))來執行'perform()'來執行任何業務邏輯,那麼您可能需要'驗證'該方法調用。但是我沒有看到''getAvgPrice()''執行'verify'的任何用法。如果可能,提供'perform()'執行 –
驗證(portfolio.getAvgPrice(isA(Stock.class)))語句和update()方法。 –