Mockito-第一篇

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

开启Mockito单元测试系列,这是第一篇。本文将介绍如何用Mockito来mock一个股票服务接口,在服务尚未实现的情况下,验证一个客户股票投资组合的计算逻辑。
谨以此文纪念2020年春美股的一周2次熔断

股票类

首先定义一个股票类

package com.github.stock;

public class Stock {
    private String stockId;
    private String name;
    private int quantity;

    public Stock(String stockId, String name, int quantity){
        this.stockId = stockId;
        this.name = name;
        this.quantity = quantity;
    }

//节约篇幅,get/set省略
}

然后定义一个服务接口

public interface StockService {
    public double getPrice(Stock stock);
}

实际案例中,我们可以通过调用行情服务商提供的接口来获得股票行情。
最后,我们定义一个客户的股票投资组合。

package com.github.stock;

import java.util.List;

public class Portfolio {
    private StockService stockService;
    private List<Stock> stocks;

//省略get/set

    public double getMarketValue(){
        double marketValue = 0.0;

        for(Stock stock:stocks){
            marketValue += stockService.getPrice(stock) * stock.getQuantity();
        }
        return marketValue;
    }
}

用Mockito来进行单元测试

package com.github.stock;

//import省略
public class PortfolioTest {
    Portfolio portfolio;
    StockService stockService;

    @BeforeEach
    public void setUp(){
        //Create a portfolio object which is to be tested
        portfolio = new Portfolio();

        //Create the mock object of stock service
        stockService = mock(StockService.class);

        //set the stockService to the portfolio
        portfolio.setStockService(stockService);
    }
    @Test
    public void testMarketValue(){

        //Creates a list of stocks to be added to the portfolio
        List<Stock> stocks = new ArrayList<Stock>();
        Stock teslaStock = new Stock("1","tesla", 10);
        Stock amazonStock = new Stock("2","amazon",100);

        stocks.add(teslaStock);
        stocks.add(amazonStock);

        //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);
    }
}

为了测试portfolio.getMarketValue这个方法,

  • 用Mockito Mock了stockService
  • 用Mockito的when/thenReturn组合制造stub。当getPrice方法被调用时,我们返回一个指定的价格,如tesla的股票是500。
  • 设置客户的投资组合
  • 调用assertJ的assertThat断言来验证getMarketValue的结果是否符合预期。
image.png

>>>>我是可爱的小绿条<<<<

Maven依赖

为了能使用Mockito和AssertJ,需要在项目的pom.xml中添加如下依赖

         <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>3.3.3</version>
            <scope>test</scope>
        </dependency>
    <dependency>
      <groupId>org.assertj</groupId>
      <artifactId>assertj-core</artifactId>
      <version>3.15.0</version>
      <scope>test</scope>
    </dependency>
关注作者公众号

相关文章

  • Mockito-第一篇

    开启Mockito单元测试系列,这是第一篇。本文将介绍如何用Mockito来mock一个股票服务接口,在服务尚未实...

  • mockito- 提升用例完整度利器(2)

    本文是介绍提升测试完整度工具 的第二篇:mockito -- 一个源于java的测试框架。 mock测试在上篇已经...

  • test

    新年第一篇 新年第一篇 新年第一篇 新年第一篇 新年第一篇 新年第一篇 新年第一篇 新年第一篇 新年第一篇 新年第一篇

  • 第一篇文章

    第一篇文章第一篇文章第一篇文章第一篇文章第一篇文章第一篇文章第一篇文章第一篇文章第一篇文章第一篇文章第一篇文章第一...

  • 第一篇 简书

    第一篇 简书第一篇 简书第一篇 简书第一篇 简书第一篇 简书第一篇 简书第一篇 简书

  • 发布第一篇

    发布第一篇,发布第一篇

  • 第一篇

    这是第一篇?是的,就是第一篇。呵呵。

  • 如何当好创业公司的CTO?

    这个问题其实 第一篇总有十一个字。 第一篇总有十一个字。 第一篇总有十一个字。 第一篇总有十一个字。 第一篇总有十...

  • 深挖基础知识第三篇

    第一篇总有十一个字。 第一篇总有十一个字。 第一篇总有十一个字。 第一篇总有十一个字。 第一篇总有十一个字。 第一...

  • 深挖基础知识第一篇

    第一篇总有十一个字。 第一篇总有十一个字。 第一篇总有十一个字。 第一篇总有十一个字。 第一篇总有十一个字。 第一...

网友评论

    本文标题:Mockito-第一篇

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