在某些情况下,除了验证程序的执行结果,还需要对程序的行为进行断言。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()等方法,可以满足各种场合的要求。
网友评论