Drinking Mockito with A Simple Stock Broker Simulation Program

第三方库

junit-4.13.2

mockito-core-3.12.4

hamcrest-all-1.3

objenesis-1.2

byte-buddy-1.12.10

byte-buddy-agent-1.12.10

项目目录结构

src每个类的代码

Stock

java 复制代码
package com.yaya.mockito;

import java.math.BigDecimal;

public class Stock {
    private String symbol;
    private String name;
    private BigDecimal price;

    public Stock(String symbol, String name, BigDecimal price){
        this.symbol = symbol;
        this.name = name;
        this.price = price;
    }

    public String getSymbol(){
        return symbol;
    }

    public BigDecimal getPrice(){
        return price;
    }
}

MarketWatcher

java 复制代码
package com.yaya.junit;

import com.yaya.mockito.Stock;

public interface MarketWatcher {
    public Stock getQuote(String symbol);
}

Portfolio

java 复制代码
package com.yaya.junit;

import com.yaya.mockito.Stock;

import java.math.BigDecimal;
import java.util.Map;

public class Portfolio {

    private Map<String,String> stockMap;

    public void buy(Stock stock){

    }

    public BigDecimal getAvgPrice(Stock stock){
        return new BigDecimal("10.0");
    }

    public void sell(Stock stock,int shares){

    }

}

StockBroker

java 复制代码
package com.yaya.junit;

import com.yaya.mockito.Stock;

import java.math.BigDecimal;

public class StockBroker {

    private final static BigDecimal LIMIT = new BigDecimal("0.10");

    private final MarketWatcher market;


    public StockBroker(MarketWatcher market) {
        this.market = market;
    }

    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 percentGained = priceGained.divide(avgPrice);

        if(percentGained.compareTo(LIMIT)>0){
            portfolio.sell(stock,10);
        }else if(percentGained.compareTo(LIMIT)<0){
            portfolio.buy(stock);
        }
    }
}

test类代码

StockBrokerTest

java 复制代码
package com.yaya.junit;

import com.yaya.mockito.Stock;
import org.junit.Before;
import org.junit.Test;

import java.math.BigDecimal;

import static org.junit.Assert.assertNotNull;

import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.*;

public class StockBrokerTest {

    MarketWatcher marketWatcher = mock(MarketWatcher.class);

    Portfolio portfolio = mock(Portfolio.class);

    StockBroker stockBroker;

    @Before
    public void setUp(){
        stockBroker = new StockBroker(marketWatcher);
    }

    @Test
    public void when_ten_percent_gain_then_the_stock_is_sold(){

        when(portfolio.getAvgPrice(isA(Stock.class))).thenReturn(new BigDecimal("10.00"));

        Stock myCorp = new Stock("YaYa","YaYa Corporation",new BigDecimal("11.20"));

        when(marketWatcher.getQuote(anyString())).thenReturn(myCorp);

        stockBroker.perform(portfolio,myCorp);

        verify(portfolio).sell(myCorp,10);
    }


}

运行结果

相关推荐
七夜zippoe2 天前
Agent 测试实战:单元测试、集成测试与 Mock LLM 策略
ai·单元测试·集成测试·mock·agent
异彩19 天前
一个纯前端的 Chrome 插件:不搭代理,也能把接口返回编圆
前端·chrome·mockito
DsirNg19 天前
接口协作的交接面:让并行开发从约定走到发布
mock·ci·契约测试·接口契约·前后端协作
Helix25019 天前
Python单元测试实战:pytest框架从入门到企业级测试体系搭建指南
python·单元测试·实战·mock·pytest·测试覆盖率·fixture
光年20001 个月前
Mock-Server开箱即用的Mock服务
java·maven·mock·jetty
liulilittle1 个月前
mock 规范总纲
ai·自动化·llm·mock·测试·tools
liulilittle1 个月前
麻将结算全链路语义(SETTLE_SEMANTICS)
ai·自动化·llm·mock·lua·测试
liulilittle1 个月前
麻将服务器崩溃补偿与异常处理语义(CRASH_SEMANTICS)
ai·自动化·llm·mock·lua·测试·tools
liulilittle1 个月前
麻将 UI 层可观察行为(UI_BEHAVIOR)
ai·自动化·llm·mock·lua·测试·tools
liulilittle1 个月前
麻将节点间路由转发链:失败回退与错误传播语义(ROUTE_SEMANTICS)
ai·自动化·llm·mock·测试·script·tools