【问题标题】:Mockito Correct Usage When stubbing a method with return value使用返回值存根方法时的 Mockito 正确用法
【发布时间】:2017-07-03 07:19:43
【问题描述】:

我从 Mockito for Spring 一书中找到了以下测试:

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"));

但未使用 verify 语句验证是否调用了 getAvgPrice()。 另外我没有在测试用例中进一步使用返回值。

我们是否应该只对那些返回值被评估或在测试用例中进一步使用的方法进行存根? 我们不能在没有 verify() 或返回值断言的情况下编写 when() 吗?不过,在这两种情况下,我的测试都成功运行。

Mockito 的用法有误吗?

【问题讨论】:

    标签: mockito spring-test


    【解决方案1】:

    每当您对方法进行单元测试时,请记住:

    您正在将该方法作为一个 UNIT 进行测试。当您向您的 UNIT(方法)提供所有必需的数据时,您必须 verify / assert state 结果是否符合您的预期。

    1. 这里的期望意味着作为一个单元的方法的正确行为。
    2. 要提供的数据可以是输入形式,也可以是依赖类的模拟或存根形式
    3. exception 场景也是如此。当您传递错误的数据时,预期的结果将是异常。您正在测试异常状态。

    测试用例会成功,因为它在执行时没有遇到任何异常行为。一般来说,verifyassert 状态 是使单元测试有意义的原因

    【讨论】:

    • 所以如果我这样写验证语句:verify(portfolio.getAvgPrice(isA(Stock.class))) 是否可以,或者我还需要断言返回值吗?
    • 这完全取决于您的用例。如果perform() 被实现为通过调用另一个方法(如getAvgPrice(...))来执行任何业务逻辑,那么您可能必须verify 该方法调用。但我认为在getAvgPrice() 上做verify 没有任何用处。如果可能,提供perform() 实现
    • verify(portfolio.getAvgPrice(isA(Stock.class))) 语句和 update() 方法添加。
    • 在您的情况下,您必须验证 portfolio.buy()portfolio.sell() 通话。
    猜你喜欢
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 2011-12-17
    相关资源
    最近更新 更多