我从《春天的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((。 我也没有在测试用例中进一步使用返回值。
我们是否应该只存根那些返回值在测试用例中被评估或进一步使用的方法? 我们不能在没有验证((或断言返回值的情况下编写when((吗?不过,在这两种情况下,我的测试都成功运行。
是莫吉托的错误用法吗?
每当对方法进行单元测试时,请记住:
您正在将该方法作为一个单元进行测试。当您向 UNIT(方法(提供所有必需的数据时,您必须
verify
/assert
结果是否符合您的期望的状态。
- 在这里,期望意味着方法作为一个单元的正确行为。
- 要提供的数据要么是输入形式,要么是来自依赖类的模拟或存根形式
exception
场景也是如此。传递错误数据时,预期结果将是异常。您正在测试异常状态。
测试用例将成功,因为它在执行时没有遇到任何异常行为。通常,verify
或assert
状态是使单元测试有意义的原因