前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一起学Mockito(一)

一起学Mockito(一)

作者头像
写一点笔记
发布2022-08-11 17:38:57
4740
发布2022-08-11 17:38:57
举报
文章被收录于专栏:程序员备忘录程序员备忘录

项目太大,工程太多。不知道何时起,我们就没了开发环境。代码都是在预发环境上验证没问题之后发到正式环境。总之一句话,本地代码是跑不起来的,想要徒手抓bug,你就要拥有一定水平。假设跟作者一般菜,那就只能无限打印log日志了,主要是打了日志可别忘了删。否则bug没抓到,还被别人看到那乱七八糟的代码怕是又要应届生同学一顿diss了。其实搭建一套开发环境理论是可行的,但是谁也撬不动好几个部门,即便撬动了,弄出来怕是得个一两年,所以就只能用单测自我安慰了。

我以前认为单元测试是建立在开发环境的基础上的,但是现实是你没有开发环境,用最简单的基于函数的单测姿势保证覆盖率,说到这里总有种想要撂挑子的冲动......但是那没办法,写代码从来都是一份搬砖的活,不是你一个enter键就可以宇宙大爆炸的,几百行代码的大函数足以让你看透这辈子那回事,那就做个阐猴吧,虽然这过程过于痛苦,可人总归是要老死的......

Mockito是什么就不介绍了,就看看这玩意咋用吧,原理在前边的文章已经介绍过了。

1、mockito验证值是否相等

代码语言:javascript
复制

import org.junit.Test;
import org.springframework.web.servlet.ModelAndView;

import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class HomeControllerTest {

    @Test
    public void index() {
        HomeController homeController =mock(HomeController.class);
        //打桩
        when(homeController.index()).thenReturn(new ModelAndView("index"));
        ModelAndView modelAndView = homeController.index();
        System.out.println(modelAndView.getViewName());
        assertSame(modelAndView.getViewName(),"index");
    }
    }

2、打桩判断调用的次数

代码语言:javascript
复制
    @Test
    public void index() {
        HomeController homeController =mock(HomeController.class);
        when(homeController.index()).thenReturn(new ModelAndView("index")).thenReturn(new ModelAndView("zhang"));
        ModelAndView modelAndView = homeController.index();
        System.out.println(modelAndView.getViewName());
        assertSame(modelAndView.getViewName(),"index");
        modelAndView = homeController.index();
        System.out.println(modelAndView.getViewName());
        Mockito.verify(homeController,times(2)).index();
    }

3、参数匹配

有时候我们调一个函数的输入很随意的,总不能给其逐个设置值吧,所以这块要用到匹配去做。

代码语言:javascript
复制
    @Test
    public void dapan() {
        ModelAndView modelAndView=null;
        //spy用来创建一个实体对象,会执行指定的调用方法。
        HomeController homeController =  spy(HomeController.class);
        //在调用层设置mock对象,mock用来创建一个假对象,执行方法的时候什么都不做,直接返回值
        StockService stockService = mock(StockService.class);
        homeController.setStockService(stockService);
        List<ShowTimeVo> result = new ArrayList<>();
        List<CandidateStockPo> candidateStockPos=new ArrayList<>();
        result.add(new ShowTimeVo("2022-01-10",1));
        result.add(new ShowTimeVo("2022-01-09",1));
        result.add(new ShowTimeVo("2022-01-08",1));
        CandidateStockPo candidateStockPo = new CandidateStockPo();
        candidateStockPo.setWenyuRiver(0);
        candidateStockPo.setShowCode("sh.00001");
        candidateStockPo.setIndustry("1");
        candidateStockPo.setCv(1);
        candidateStockPo.setZsm(1);
        candidateStockPos.add(candidateStockPo);
        //对stockservice进行打桩
        when(stockService.queryShowTime()).thenReturn(result);
        //进行参数匹配
        when(stockService.stockToday(anyString(),anyList())).thenReturn(candidateStockPos);
        modelAndView=homeController.today("1","");
        System.out.println(modelAndView.getViewName());
        assertSame("today",modelAndView.getViewName());
    }

4、.验证函数的确切、最少、从未调用次数

代码语言:javascript
复制
        //at least
        Mockito.verify(stockService,atLeast(1)).queryShowTime();
        //at most
        Mockito.verify(stockService,atMost(1)).queryShowTime();
        //equals
        Mockito.verify(stockService,times(1)).queryShowTime();

5、抛出异常

代码语言:javascript
复制
    @Test
    public void today() {
        HomeController homeController = spy(HomeController.class);
        StockService stockService = mock(StockService.class);
        homeController.setStockService(stockService);
        when(stockService.tongji(anyString())).thenThrow(new Exception("123"));
        try {
            homeController.today("1","1");
        }catch (Exception e){
            e.printStackTrace();
        }
    }

6、代码执行的顺序

代码语言:javascript
复制
    @Test
    public void about() {
        //create empty object
        List tianjingle = mock(List.class);

        //
        tianjingle.add("one");
        tianjingle.add("two");

        InOrder inOrder = inOrder(tianjingle);

        inOrder.verify(tianjingle).add("one");
        inOrder.verify(tianjingle).add("two");

        List firstMock = mock(List.class);
        List secondMock = mock(List.class);

        firstMock.add("one");
        secondMock.add("1");

        InOrder inOrder1 = inOrder(firstMock, secondMock);

        inOrder1.verify(firstMock).add("one");
        inOrder1.verify(secondMock).add("1");
    }

可能是键盘的原因,我爱上mockito了~~~,明晚咋继续!

晚安

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 写点笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 4、.验证函数的确切、最少、从未调用次数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档