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


}

运行结果

相关推荐
光年200012 天前
Mock-Server开箱即用的Mock服务
java·maven·mock·jetty
liulilittle24 天前
mock 规范总纲
ai·自动化·llm·mock·测试·tools
liulilittle24 天前
麻将结算全链路语义(SETTLE_SEMANTICS)
ai·自动化·llm·mock·lua·测试
liulilittle24 天前
麻将服务器崩溃补偿与异常处理语义(CRASH_SEMANTICS)
ai·自动化·llm·mock·lua·测试·tools
liulilittle24 天前
麻将 UI 层可观察行为(UI_BEHAVIOR)
ai·自动化·llm·mock·lua·测试·tools
liulilittle24 天前
麻将节点间路由转发链:失败回退与错误传播语义(ROUTE_SEMANTICS)
ai·自动化·llm·mock·测试·script·tools
liulilittle24 天前
mock 框架架构
ai·架构·自动化·llm·mock·测试·tools
liulilittle24 天前
C++ 引擎接口到 mock 的映射(INTERFACE_MAP)
ai·自动化·llm·mock·lua·测试·tools
DsirNg2 个月前
别把联调当验收:用可执行契约管住接口变更
ci/cd·mock·openapi·契约测试·接口契约·前后端协作·pact
console.log('npc')2 个月前
Mock 服务设计指南
前端框架·mock·react·visual studio·项目架构