五分钟技术趣谈 | Java常用的单元测试框架介绍
haoteby 2024-12-15 13:12 27 浏览
本文主要讲述java常用的单元测试框架,包括junit5、Mockito、SpringBootTest框架,通过讲解各框架常用注解、使用样例、注意事项,让大家在开发过程中能够快速、高效选择适合自己的单元测试框架。
作者:孟祥路
单位:中移(杭州)信息技术有限公司
Part 01
● JUnit5框架 ●
1.1 Junit5介绍
Junit5需要Java 8或更高版本,和Junit4只是一个单独的Jar包不同,目前的Junit5组成如下:JUnit5=JUnit Platform+JUnit Jupiter+JUnit Vintage
- JUnit Platform:
是Junit向测试平台演进,提供平台功能的模块,通过JUnit Platform,其他的自动化测试引擎或开发人员自己定制的引擎都可以接入Junit实现对接和执行
- JUnit Jupiter:
这是Junit5的核心,可以看作是承载Junit4原有功能的演进,它包含了很多丰富的新特性来使JUnit自动化测试更加方便、功能更加丰富和强大。
本系列就会重点围绕Jupiter中的一些特性进行介绍。Jupiter本身也是一个基于Junit Platform的引擎实现。
- JUnit Vintage:
Junit发展了10数年,Junit3和Junit4都积累了大量的用户,作为新一代框架,这个模块是对JUnit3,JUnit4版本兼容的测试引擎,使旧版本Junit的自动化测试脚本也可以顺畅运行在Junit5下,它也可以看作是基于Junit Platform实现的引擎范例。
1.2 测试实例生命周期介绍
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
* PER_METHOD(默认):JUnit在执行每个测试方法之前创建每个测试类的新实例
* PER_CLASS:JUnit Jupiter在同一个测试实例上执行所有测试方法,当使用这种模式时,每个测试类将创建一个新的测试实例。因此,如果您的测试方法依赖于存储在实例变量中的状态,则可能需要在@BeforeEach或@AfterEach方法中重置该状态。
1.3 Junit5常用注解介绍
@BeforeAll
JUnit5@BeforeAll注释是JUnit4中@BeforeClass注释的替代。它用于表示应在当前测试类中的所有测试方法之前执行的带的方法。
备注:@BeforeAll注释的方法必须是静态方法,否则会报运行时错误。
@BeforeEach
JUnit5@BeforeEach注释替代了JUnit4中的@Before注释。被注释的方法会在当前类中的每个Test方法之前执行。也就是说有多少个test这个方法就会执行多少次。
备注:@BeforeEach注释的方法一定不能是静态方法,否则会报发运行时错误。
@AfterEach
JUnit5@AfterEach注释是JUnit4中@After注释的替换。它用于表示应在当前类中的每个@Test方法之后执行带注释的方法。
@AfterAll
JUnit5@AfterAll注释是JUnit4中@AfterClass注释的替换。它用于表示应在当前测试类中的所有测试之后执行带注释的方法。
备注:@AfterAll注释的方法必须是静态方法,否则会报运行时错误。
Junit5当中使用@BeforeEach替换了@Before使用 @AfterEach替换了@After
@Disabled可以用于不运行某些test的场景。
@Tag可以用于将测试分类。
JUnit Jupiter支持下列注解,用于配置测试和扩展框架。
所有核心注解位于junit-jupiter-api模块中的org.junit.jupiter.api包中。
Part 02
● spring-boot-test框架 ●
2.1 版本迭代
在JUnit4中,自定义框架通常意味着使用@RunWith注释来指定一个自定义的运行器。使用多个运行器是有问题的。
Junit5在Spring boot 2.1.x之前,@SpringBootTest需要配合@ExtendWith(SpringExtension.class)才能正常工作的。
而在Spring boot 2.1.x之后,我们查看@SpringBootTest 的代码会发现,其中已经组合了@ExtendWith(SpringExtension.class),因此,无需在进行该注解的使用了。
Spring Boot 2.2.0版本开始引入JUnit5作为单元测试默认库
Junit5中包含JUnit Vintage:这个模块是兼容JUnit3、JUnit4版本的测试引擎,使得旧版本的自动化测试也可以在JUnit5下正常运行。防止使用旧的junit4相关接口,可以进行依赖排除,如下图:
SpringBoot 2.4以上版本移除了默认对Vintage的依赖。如果需要兼容JUnit4.x版本,需要自行引入。
SpringBootTest默认集成了以下功能:
备注:JUnit4前移注意事项
2.2 Spring Boot Test中的主要注解
从功能上讲,Spring Boot Test中的注解主要分如下几类:
2.2.1 配置类型的注解
使用@SpringBootApplication启动测试或者生产代码,被@TestComponent描述的Bean会自动被排除掉。如果不是则需要向@SpringBootApplication添加TypeExcludeFilter。
2.2.2 mock类型的注解
@MockBean和@SpyBean这两个注解,在mockito框架中本来已经存在,且功能基本相同。Spring Boot Test又定义一份重复的注解,目的在于使MockBean和SpyBean被ApplicationContext管理,从而方便使用。MockBean和SpyBean功能非常相似,都能模拟方法的各种行为。不同之处在于MockBean是全新的对象,跟正式对象没有关系;而SpyBean与正式对象紧密联系,可以模拟正式对象的部分方法,没有被模拟的方法仍然可以运行正式代码。
@MockBean 只能 mock 本地的代码——或者说是自己写的代码,对于储存在库中而且又是以 Bean 的形式装配到代码中的类无能为力。
@SpyBean 解决了 SpringBoot 的单元测试中
@MockBean 不能 mock 库中自动装配的 Bean 的局限
2.2.3 自动配置类型的注解(@AutoConfigure*)
这些注解可以搭配@\*Test使用,用于开启在@\*Test中未自动配置的功能。例如@SpringBootTest和@AutoConfigureMockMvc组合后,就可以注入org.springframework.test.web.servlet.MockMvc。
2.2.3.1 自动配置类型有两种使用方式
a.在功能测试(即使用@SpringBootTest)时显示添加。
b.一般在切片测试中被隐式使用,例如@WebMvcTest注解时,隐式添加了@AutoConfigureCache
@AutoConfigureWebMvc
@AutoConfigureMockMvc。
2.2.4 启动测试类型的注解
所有的@*Test注解都被@BootstrapWith注解,它们可以启动。
ApplicationContext,是测试的入口,所有的测试类必须声明一个@*Test注解。
除了@SpringBootTest之外的注解都是用来进行切面测试的,他们会默认导入一些自动配置。一般情况下,推荐使用@SpringBootTest而非其它切片测试的注解,简单有效。若某次改动仅涉及特定切片,可以考虑使用切片测试。
2.2.5 常用配置介绍
@SpringBootTest,其中包含的配置项如下:
@WebEnvironment,其中包含的配置项如下:
Part 03
● Mockito框架 ●
3.1 常用的Mockito方法
3.2 Mockito参数适配方法
Mockito.anyString()
Mockito.anyInt()
Mockito.anyLong()
Mockito.anyDouble()
Mockito.anyObject() 表示任何对象
Mockito.any(clazz) 表示任何属于clazz的对象
Mockito.anyCollection()
Mockito.anyCollectionOf(clazz)
Mockito.anyList(Map, set)
Mockito.anyListOf(clazz)
注:Mockito.anyString() 不能匹配到 null 参数,如果还需要匹配 null,可以使用 Mockito.any()。
Part 04
● 单元测试样例 ●
4.1 Mock redis、kafka方法
方法1:
@SpringBootTest通过@Resource引入对象测试,需要依赖redis环境(会启动spring boot 容器)
方法2:
//声明变量
private AsyncService asyncService;
//需要mock的对象
private StringRedisTemplate stringRedisTemplate;
//创建要测试对象
asyncService = new AsyncServiceImpl();
//mock对象(也可以使用@Mock注解方式)
StringRedisTemplate stringRedisTemplate =
mock(StringRedisTemplate.class,Mockito.RETURNS_DEEP_STUBS);
KafkaProducer kafkaProducer = mock(KafkaProducer.class);
//属性赋值
ReflectionTestUtils.setField(asyncService,
"stringRedisTemplate", stringRedisTemplate);
ReflectionTestUtils.setField(asyncService,
"kafkaProducer", kafkaProducer);
@Test
@DisplayName("mock redis、kafka 测试")
public void redisTest() {
when(stringRedisTemplate.opsForValue().get(anyString())).thenReturn("2222");
Assertions.assertTrue(asyncService.testRedis("真实方法调用"));
}
4.2 Spring Security模拟登录方法
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<version>5.6.5</version>
<scope>test</scope>
</dependency>
注解:@WithMockUser(roles = "ROOT", username = "root")
4.3 远程接口调用方法(Controller入口测试)
- MockMVC的基本步骤
(1) mockMvc.perform执行一个请求。
(2) MockMvcRequestBuilders.get("XXX")构造一个请求。
(3) ResultActions.param添加请求传值
(4) ResultActions.accept()设置返回类型
(5) ResultActions.andExpect添加执行完成后的断言。
(6) ResultActions.andDo添加一个结果处理器,表示要对结果做点什么事情,比如处使用print()输出整个响应结果信息。
(7) ResultActions.andReturn表示执行完成后返回相应的结果。
相关推荐
- JAVA零基础入门:JDK的概述及安装(jdk完整安装教程)
-
一.什么是jdkJDK(JavaDevelopmentToolKit)是Java开发工具包,JDK是整个JAVA的核心,包括了Java运行环境(JavaRuntimeEnvirnment),一...
- 开源、强大的工作流引擎:camunda入门介绍
-
原创不易,请多多支持!对Java技术感兴趣的童鞋请关注我,后续技术分享更精彩。简介CamundaisaJava-basedframeworksupportingBPMNforwork...
- Centos8搭建Java环境(JDK1.8+Nginx+Tomcat9+Redis+Mysql)
-
一、开篇1.1目的每次换新的服务器,都要找资料配下环境,所以我写这篇文章,重新梳理了一下,方便了自己,希望也能给大家带来一些帮助。安装的软件有:JDK1.8+Nginx+Tomcat9+...
- 记录一次tomcat的升级过程(tomcat6升级tomcat8)
-
原因:ApacheTomcat资源管理错误漏洞(CVE-2021-42340)版本:ApacheTomcat/9.0.46,tomcat解决方法:升级tomcat9到最新版本9.0.581.官...
- Tomcat10安装与配置图文教程(tomcat安装及配置)
-
Tomcat10安装与配置图文教程1、百度搜索“tomcat下载”,进入官网下载https://tomcat.apache.org/index.html...
- VS2022配置x86/x64调用32位和64位汇编语言动态库环境
-
配置X86MASM汇编环境1.创建项目打开VS2022创建新项目,新建asm文件(注意要手动修改cpp文件后缀名为asm文件后缀名)。2.设置入口点选择菜单栏中的“调试”-“demo调试属性”-...
- ARM版Win10用户狂喜 微软全新补丁让应用不再不兼容
-
Windows10onARM仅支持模拟32位的X86应用程序,这意味着大多数的桌面应用是无法在这一平台上运行的,这在很大程度上限制该平台的发展。为了解决这一问题,微软在内部开发频道推出可用于AR...
- 分享收藏的 oracle 11.2.0.4各平台的下载地址
-
概述oracle11.2.0.4是目前生产环境用的比较多的版本,同时也是很稳定的一个版本。目前官网上已经找不到下载链接了,有粉丝在头条里要求分享一下下载地址。一、各平台下载地址...
- Android-x86现已基于5.1.1 Lollipop:支持UEFI和64位内核
-
采用Linux内核的Android-x86,旨在为PC带来最新的Android移动操作系统体验。而近日,该操作系统已经发布了Android-x865.1的首个候选发布(RC)版本。发行说明中提到:A...
- Linux Kernel源码阅读: x86-64 系统调用实现细节(二)
-
特别说明:该文章前两天发布过,但一直在审核中。看头条网友说字数太多可能一直处于审核中状态,我把该文章拆分成几个章节发布,如影响阅读体验还请见谅。五、系统调用编号...
- 树莓派4B安装win10后实测,CPU秒杀AMD Athlon64 3200+
-
在上一篇文章介绍了如何给树莓派4B安装win10系统,这篇就简单对系统进行测试,上一篇文章链接https://www.toutiao.com/i7015518822056886821/因为树莓派是a...
- 一键离线部署x86、arm64 RabbitMQ,花了2天去验证整理,直接拿去
-
最近有一个项目,客户是内网网络,只能离线部署,采用的麒麟ARM64服务器系统,不能远程部署,需要提前准备离线部署包让客户IT拷备上去再现场部署,部署时间就只有1天。自家系统采用的vue+springb...
- Linux软件包管理(linux系统软件包的安装方法,并简要说明其特点)
-
Linux系统如果需要安装软件怎么办?如何安装,大概有以下几种方式1.二级制软件包管理(RPM、YUM)...
- Tachyum要做全球最强64位处理器:性能比X86强,面积比ARM小
-
全球半导体芯片研发、生产最强的国家非美国莫属,如果有某家美国公司宣布要开发性能超强的芯片,大家不会意外,但要是一家斯洛伐克初创公司宣布要研发超级芯片呢?Tachyum公司就是这样一家公司,成立于201...
- Android L 64位模拟器终于来了:x86独享
-
GoogleI/O2014大会已经过去了很久,64位的AndroidL依然停留在纸面上,但现在至少可以让开发者们先行品尝品尝了:64位的AndroidL模拟器已经发布。这次公布的模拟器镜像是专...