我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java用正确的姿势写单元测试以及mock

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java用正确的姿势写单元测试以及mock

1. 前言

对于一些简单的功能或业务,我们也许可以通过前端调试、postman等接口工具、main函数调用进行测试。但这每次改动代码都要人力测试,耗费大量的人力资源且不高效,真正的项目中单元测试是必不可少的。

2. 要点

单元测试的三步走:

组装方法入参

执行方法

对方法的执行结果进行断言(Assert)比对

建议把所有实际操作数据的测试方法上面加上事务注解。

对于会抛异常的情况,需要用try包住,在catch中断言异常文本,以及在try下面加上Assert.fail()确保一定会抛异常。

3. 入门级知识点

3.1 常用注解

@SpringBootTest:把当前类标记为测试类并交给spring管理,通常和@RunWith(SpringRunner.class)一起出现。另如果需要初始化环境变量,建议先定义一个父测试类,加上上面两个注解,写一个静态内部类System.setProperty("key","value")。其他测试类继承即可。

@Test:用在方法上,标记为测试方法。注意必须是public。

@Before:所有单元测试前都会执行一遍。注意:启动单元测试有两种方式,启动方法和启动类,启动类会自动执行测试类下的所有测试方法

@After:所有单元测试后都会执行一遍。

测试方法的执行顺序是:构造方法->@Before->@Test->@After

上面两个方法在Junit5种被换为@BeforeEach和@AfterEach。

另外Junit5还新加了几个注解,比如:@DisplayName("对测试方法重命名");@BeforeAll、@AfterAll。@BeforeAll会放在构造方法前,@AfterAll会放在@After后;且两个都是静态方法,整个测试类只会执行一此。

3.2 测试私有方法

ReflectionTestUtils.invokeMethod(类对象,"私有方法名",.....私有方法入参);

另外如果此私有方法里面有spring的bean比如类对象,需要在调用invokeMethod之前注入类对象:

ReflectionTestUtils.setField(类对象,"类对象内需要注入的类名",需要注入的类);

4. mock

对于一些外部接口,可能无法控制本地环境能收到结果,或者干脆就没必要真实去调用,就可以采用mock的方法,模拟出接口返回值。

本文主要用org.mockito包进行实例说明。

4.1 基本写法:

4.1.1 mock常见的写法有两种:

Mockito.doReturn(1)when(demoService).demoMethod("a");

when(demoService.demoMethod("a")).thenReturn(1);

表示同一个意思:当执行demoService类的demoMethod方法,且入参是a时,将会返回1。生效时间是这行代码到本测试方法结束。

4.1.2 任意入参

可以mock任意入参时都会返回设定的返回值。

any():任意字符串

anyLong():任意Long类型

更多略

4.1.3 mock返回值

除了thenReturn,还有thenThrow,另外.thenCallRealMethod代表返回真实结果。

4.2 mock注入

如果要对一个类使用mock,需要先改变类的注入方式,常见的注解有:

@Mock:对函数的调用均使用mock,不会调用真实方法

@Spy:对函数的调用是真实调用,即代码会真实走到方法内部。

@InjectMocks:可以调用真实代码的方法,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中。

@MockBean:spring封装的@mock,会加入spring容器

@SpyBean:spring封装的@Spy,会加入spring容器

4.3 Mock高级用法

4.3.1 捕获入参

定义:

private ArgumentCaptor ar = ArgumentCaptor.forClass(DTO.class);

使用:

Mockito.doReturn(true).when(demoClient).demoMethod(ar.capture());

校验:

List dtoList = ar.getAllValues();  // 这里的值是方法入参

由此可以得到mock时的入参,一般用于定时任务时校验深层方法的入参是否正确。

4.3.2 mock静态方法

MockedStatic theMock = Mockito.mockStatic(Util.class);

theMock.when(()->Util.getTime(any())).thenReturn(new Date());

另外因为是mock静态方法,如果一个测试类中静态方法被多个方法mock,会抛异常,解决办法有两种:

手动调用close()。

把第一行包在try with resources块的小括号里面,把第二行写在try(){}的大括号里面,代表只有块里面的需要mock。

4.3.3 mock私有方法

需要引入PowerMockito包,具体使用可另行百度。

来源地址:https://blog.csdn.net/lyk1184919379/article/details/131159327

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java用正确的姿势写单元测试以及mock

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录