当前位置: 首页 > news >正文

java单元测试简介(基于SpringBoot)

java单元测试简介(基于SpringBoot)

  • mockito
    • mock
      • 创建mock对象的另一种方式:@Mock
    • verify
    • stubbing(存根)
    • Spy(间谍)
    • mock 静态方法
  • mockito在springboot mock中的实战

mockito

通常,在我们写单测时,会遇到被测试类与外部类有依赖的时候,尤其是与数据库相关的这种费时且有状态的类,很难做单元测试。但好在可以通过“Mockito”这种仿真框架来模拟这些比较费时的类,从而专注于测试某个类内部的逻辑。

mock

@Data
public class Cat {private String name;private long id;private int age;public void call() {System.out.println("miao~");}public String copy(String str) {return str;}
}
import static org.mockito.Mockito.*@Testpublic void testForMock00() throws Exception {// mock对象Cat cat = mock(Cat.class);// 基本类型返回初始值System.out.println(cat.getAge());// 包装类型返回nullSystem.out.println(cat.getName());// 其行为已和原对象脱离cat.call();}

特点:该对象是一个mock对象,其行为已经和原始对象不同,其public方法返回值已被mock,基本对象返回初始值,包装类型返回null。

创建mock对象的另一种方式:@Mock

    @Mockprivate Cat cat2;

verify

verify方法,可以用来校验mock对象对应的方法是否被调用过,以及具体调用次数

    @Testpublic void testForMock01() throws Exception {Cat cat = mock(Cat.class);cat.setAge(10);// 校验调用了一次setAge,传参10verify(cat).setAge(10);cat.setAge(9);// 校验调用了一次setAge,传参9verify(cat, times(1)).setAge(9);// 校验调用了两次setAge,传参任意verify(cat, times(2)).setAge(anyInt());}

stubbing(存根)

当测试的单元依赖这个mock对象的返回值时,我们可以通过提前申明这个函数的返回值来测试各种各样的场景。
提前申明的这个过程被称为存根。

注意点

  • 存根时可以被覆盖的(即对一种情况多次存根的话,以最后一次为准),但是不鼓励这么做,可读性会变差。
  • 一旦存根后,这个函数会一直返回这个值,不管你调用多少次。
        Cat cat = mock(Cat.class);// 连续存根 调用getAge 第一次返回1 之后返回2when(cat.getAge()).thenReturn(1,2);Assert.assertEquals( 1, cat.getAge());Assert.assertEquals( 2, cat.getAge());Assert.assertEquals( 2, cat.getAge());// mock 调用copy 传参 你好 返回 你好when(cat.copy("你好")).thenReturn("你好");System.out.println(cat.copy("你好"));when(cat.copy("包子")).thenReturn("包子");// 传参饺子,不符合要求,返回nullSystem.out.println(cat.copy("饺子"));//传参任意参数,返回包子when(cat.copy(any())).thenReturn("包子");System.out.println(cat.copy("你好"));

存根也可以用来指定抛出异常

        // 调用getAge 抛出异常when(cat.getAge()).thenThrow(new UnsupportedOperationException());cat.getAge();

存根也可以设置回调函数,在回调函数中,我们可以获取到对应方法调用时的入参,以及返回值

    @Testpublic void testForMock03() throws Exception {Cat cat = mock(Cat.class);Answer answer = new Answer() {@Overridepublic Object answer(InvocationOnMock invocationOnMock) throws Throwable {// 获取调用的方法名:System.out.println(invocationOnMock.getMethod().getName());// 获取调用的方法入参:System.out.println(Arrays.asList(invocationOnMock.getArguments()));// 设置调用的方法返回值:return "return is me";}};when(cat.copy(anyString())).thenAnswer(answer);System.out.println(cat.copy("包饺子"));}

其他指定行为的:
doNothing() 啥也不干
doCallRealMethod() 调用真正的方法(不代理)

Spy(间谍)

对该对象所有方法的调用都直接调用真实方法,但也可以对某些我们关注的方法进行存根

    @Testpublic void testForMock04() throws Exception {Cat cat = new Cat();cat.setName("喵喵");Cat spy = spy(cat);when(spy.getName()).thenReturn("包子");// 原始对象,真实调用System.out.println(cat.getName());// 间谍对象且方法被存根System.out.println(spy.getName());// 间谍对象且方法没有被存根spy.call();when(spy.copy(anyString())).thenReturn("***");// spy对象实际也会访问原始对象的方法,并非直接mockSystem.out.println(spy.copy("你好"));}

mock 静态方法

除了实例方法,mockito还可以mock静态方法,具体使用如下。

    @Testpublic void testForMock05() throws Exception {Mockito.mockStatic(Cat.class);when(Cat.getType()).thenReturn("Cat");System.out.println(Cat.getType());}

mockito在springboot mock中的实战

http://www.lryc.cn/news/31150.html

相关文章:

  • Linux常用命令操作
  • SpringCloud GateWay配置—TLS 和 SSL、Http超时配置
  • python Django中的cookies和session会话保持技术
  • vue3的v-model指令
  • Matlab小波去噪——基于wden函数的去噪分析
  • 分布式对象存储——Apache Hadoop Ozone
  • Linux 和数据库笔记-03
  • 布尔定律---布尔代数的基本定律
  • OSG三维渲染引擎编程学习之七十五:“第七章:OSG场景图形交互” 之 “7.6 多视图”
  • 【计算机】单位制前缀的歧义-KB、kb、MB混用
  • nodejs调用浏览器打开URL链接
  • ARM uboot 的移植2-从三星官方 uboot 开始移植
  • js作用域和作用域链
  • C语言字符串
  • Eureka注册中心快速入门
  • xmu 离散数学 卢杨班作业详解【1-3章】
  • mvn命令
  • JS - 事件循环EventLoop
  • 【Java基础】30分钟Git 从入门到精通
  • 0100 MySQL03
  • 32- PyTorch基础 (PyTorch系列) (深度学习)
  • 用gdb.attach()在gdb下断点但没停下的情况及解决办法
  • Linux入门篇-作业(jobs)调度(本质仍然是进程)
  • vue 监听 取消监听
  • 0103深度优先搜索和单点连通-无向图-数据结构和算法(Java)
  • 进销存管理系统
  • Sonar:VSCode配置SonarLint/SonarLint连接SonarQube
  • 陀螺仪小车(Forerake-Car)
  • Leetcode Day5 含有重复元素集合的组合+
  • Mac Book pro(M1)使用总结