美文网首页
Mockito.verify

Mockito.verify

作者: antony已经被占用 | 来源:发表于2020-03-30 21:50 被阅读0次

    在某些情况下,除了验证程序的执行结果,还需要对程序的行为进行断言。Mockito提供了verify的方法来支持这一类的需求。

    例如,在获取到了投资者的投资组合之后并返回之前,假设需要将计算结果落库。

    public double getMarketValue(){
        double marketValue = 0.0;
    
        for(Stock stock:stocks){
            marketValue += stockService.getPrice(stock) * stock.getQuantity();
        }
        if(marketValue>0) {
            mapper.save(marketValue);
        }
        return marketValue;
    }
    

    因此,定义了一个PortfolioMapper接口。

    package com.github.mockito.stock;
    
    public interface PortfolioMapper {
        int save(double marketValue);
    }
    

    来看一下测试用例

    @Test
    public void testPortfolioVerifySave(){
        //add stocks to the portfolio
        portfolio.setStocks(stocks);
    
        //mock the behavior of stock service to return the value of various stocks
        when(stockService.getPrice(teslaStock)).thenReturn(500.00);
        when(stockService.getPrice(amazonStock)).thenReturn(1000.00);
    
        assertThat(portfolio.getMarketValue()).isEqualTo(105000.0);
        verify(mapper).save(105000.0);
     
    }
    

    改造一下之前的测试用例,在断言投资组合价值之后,增加了
    verify(mapper).save(105000.0);
    这个断言的含义是,验证mapper.save(105000)这行代码被调用了一次,等价于
    verify(mapper,times(1)).save(105000.0);

    此外,还可以验证方法没有被执行。如一下这个案例

    @Test
    public void testPortfolioVerifySaveNotCalled(){
        //add stocks to the portfolio
        portfolio.setStocks(stocks);
    
        //mock the behavior of stock service to return the value of various stocks
        when(stockService.getPrice(teslaStock)).thenReturn(0.0);
        when(stockService.getPrice(amazonStock)).thenReturn(0.0);
    
        assertThat(portfolio.getMarketValue()).isEqualTo(0);
        verify(mapper,never()).save(anyDouble());
    }
    

    按照程序的逻辑,只有股票投资组合价值>0的才会被记录。因此在这个案例中,mapper.save方法不会被调用。这里还使用了
    Mockito.anyDouble()
    这一模糊匹配的方式,表示无论save方法的入参是什么,都可以匹配到。这也证明,save方法的确是没有被调用。
    在verify中,除了times(),never()之外,Mockito还有类似atLeast(),atMost()等方法,可以满足各种场合的要求。

    image.png

    相关文章

      网友评论

          本文标题:Mockito.verify

          本文链接:https://www.haomeiwen.com/subject/gjvbuhtx.html