当前位置:首页 > 科技  > 软件

Java常用的单元测试框架介绍

来源: 责编: 时间:2023-12-24 10:14:07 195观看
导读Part 01、 JUnit5框架 1.1 Junit5介绍Junit5需要Java 8或更高版本,和Junit4只是一个单独的Jar包不同,目前的Junit5组成如下:JUnit5=JUnit Platform+JUnit Jupiter+JUnit Vintage- JUnit Platform:是Junit向测试平台演进,

VNQ28资讯网——每日最新资讯28at.com

Part 01、  JUnit5框架 

1.1 Junit5介绍VNQ28资讯网——每日最新资讯28at.com

Junit5需要Java 8或更高版本,和Junit4只是一个单独的Jar包不同,目前的Junit5组成如下:JUnit5=JUnit Platform+JUnit Jupiter+JUnit VintageVNQ28资讯网——每日最新资讯28at.com

- JUnit Platform:VNQ28资讯网——每日最新资讯28at.com

是Junit向测试平台演进,提供平台功能的模块,通过JUnit Platform,其他的自动化测试引擎或开发人员自己定制的引擎都可以接入Junit实现对接和执行VNQ28资讯网——每日最新资讯28at.com

- JUnit Jupiter:VNQ28资讯网——每日最新资讯28at.com

这是Junit5的核心,可以看作是承载Junit4原有功能的演进,它包含了很多丰富的新特性来使JUnit自动化测试更加方便、功能更加丰富和强大。VNQ28资讯网——每日最新资讯28at.com

本系列就会重点围绕Jupiter中的一些特性进行介绍。Jupiter本身也是一个基于Junit Platform的引擎实现。VNQ28资讯网——每日最新资讯28at.com

- JUnit Vintage:VNQ28资讯网——每日最新资讯28at.com

Junit发展了10数年,Junit3和Junit4都积累了大量的用户,作为新一代框架,这个模块是对JUnit3,JUnit4版本兼容的测试引擎,使旧版本Junit的自动化测试脚本也可以顺畅运行在Junit5下,它也可以看作是基于Junit Platform实现的引擎范例。VNQ28资讯网——每日最新资讯28at.com

1.2 测试实例生命周期介绍VNQ28资讯网——每日最新资讯28at.com

@TestInstance(TestInstance.Lifecycle.PER_CLASS)VNQ28资讯网——每日最新资讯28at.com

* PER_METHOD(默认):JUnit在执行每个测试方法之前创建每个测试类的新实例 VNQ28资讯网——每日最新资讯28at.com

* PER_CLASS:JUnit Jupiter在同一个测试实例上执行所有测试方法,当使用这种模式时,每个测试类将创建一个新的测试实例。因此,如果您的测试方法依赖于存储在实例变量中的状态,则可能需要在@BeforeEach或@AfterEach方法中重置该状态。VNQ28资讯网——每日最新资讯28at.com

1.3 Junit5常用注解介绍VNQ28资讯网——每日最新资讯28at.com

@BeforeAllVNQ28资讯网——每日最新资讯28at.com

JUnit5@BeforeAll注释是JUnit4中@BeforeClass注释的替代。它用于表示应在当前测试类中的所有测试方法之前执行的带的方法。 VNQ28资讯网——每日最新资讯28at.com

备注:@BeforeAll注释的方法必须是静态方法,否则会报运行时错误。VNQ28资讯网——每日最新资讯28at.com

@BeforeEachVNQ28资讯网——每日最新资讯28at.com

JUnit5@BeforeEach注释替代了JUnit4中的@Before注释。被注释的方法会在当前类中的每个Test方法之前执行。也就是说有多少个test这个方法就会执行多少次。VNQ28资讯网——每日最新资讯28at.com

备注:@BeforeEach注释的方法一定不能是静态方法,否则会报发运行时错误。VNQ28资讯网——每日最新资讯28at.com

@AfterEachVNQ28资讯网——每日最新资讯28at.com

JUnit5@AfterEach注释是JUnit4中@After注释的替换。它用于表示应在当前类中的每个@Test方法之后执行带注释的方法。VNQ28资讯网——每日最新资讯28at.com

@AfterAll VNQ28资讯网——每日最新资讯28at.com

JUnit5@AfterAll注释是JUnit4中@AfterClass注释的替换。它用于表示应在当前测试类中的所有测试之后执行带注释的方法。VNQ28资讯网——每日最新资讯28at.com

备注:@AfterAll注释的方法必须是静态方法,否则会报运行时错误。VNQ28资讯网——每日最新资讯28at.com

Junit5当中使用@BeforeEach替换了@Before使用 @AfterEach替换了@AfterVNQ28资讯网——每日最新资讯28at.com

@Disabled可以用于不运行某些test的场景。VNQ28资讯网——每日最新资讯28at.com

@Tag可以用于将测试分类。VNQ28资讯网——每日最新资讯28at.com

JUnit Jupiter支持下列注解,用于配置测试和扩展框架。VNQ28资讯网——每日最新资讯28at.com

所有核心注解位于junit-jupiter-api模块中的org.junit.jupiter.api包中。VNQ28资讯网——每日最新资讯28at.com

图片VNQ28资讯网——每日最新资讯28at.com

图片VNQ28资讯网——每日最新资讯28at.com

Part 02、  spring-boot-test框架 

2.1 版本迭代VNQ28资讯网——每日最新资讯28at.com

在JUnit4中,自定义框架通常意味着使用@RunWith注释来指定一个自定义的运行器。使用多个运行器是有问题的。VNQ28资讯网——每日最新资讯28at.com

Junit5在Spring boot 2.1.x之前,@SpringBootTest需要配合@ExtendWith(SpringExtension.class)才能正常工作的。VNQ28资讯网——每日最新资讯28at.com

而在Spring boot 2.1.x之后,我们查看@SpringBootTest 的代码会发现,其中已经组合了@ExtendWith(SpringExtension.class),因此,无需在进行该注解的使用了。VNQ28资讯网——每日最新资讯28at.com

Spring Boot 2.2.0版本开始引入JUnit5作为单元测试默认库VNQ28资讯网——每日最新资讯28at.com

Junit5中包含JUnit Vintage:这个模块是兼容JUnit3、JUnit4版本的测试引擎,使得旧版本的自动化测试也可以在JUnit5下正常运行。防止使用旧的junit4相关接口,可以进行依赖排除,如下图:VNQ28资讯网——每日最新资讯28at.com

图片图片VNQ28资讯网——每日最新资讯28at.com

SpringBoot 2.4以上版本移除了默认对Vintage的依赖。如果需要兼容JUnit4.x版本,需要自行引入。VNQ28资讯网——每日最新资讯28at.com

图片图片VNQ28资讯网——每日最新资讯28at.com

SpringBootTest默认集成了以下功能:VNQ28资讯网——每日最新资讯28at.com

图片图片VNQ28资讯网——每日最新资讯28at.com

图片图片VNQ28资讯网——每日最新资讯28at.com

备注:JUnit4前移注意事项VNQ28资讯网——每日最新资讯28at.com

图片图片VNQ28资讯网——每日最新资讯28at.com

2.2 Spring Boot Test中的主要注解VNQ28资讯网——每日最新资讯28at.com

从功能上讲,Spring Boot Test中的注解主要分如下几类:VNQ28资讯网——每日最新资讯28at.com

图片图片VNQ28资讯网——每日最新资讯28at.com

图片图片VNQ28资讯网——每日最新资讯28at.com

2.2.1 配置类型的注解VNQ28资讯网——每日最新资讯28at.com

使用@SpringBootApplication启动测试或者生产代码,被@TestComponent描述的Bean会自动被排除掉。如果不是则需要向@SpringBootApplication添加TypeExcludeFilter。VNQ28资讯网——每日最新资讯28at.com

图片图片VNQ28资讯网——每日最新资讯28at.com

2.2.2 mock类型的注解VNQ28资讯网——每日最新资讯28at.com

@MockBean和@SpyBean这两个注解,在mockito框架中本来已经存在,且功能基本相同。Spring Boot Test又定义一份重复的注解,目的在于使MockBean和SpyBean被ApplicationContext管理,从而方便使用。MockBean和SpyBean功能非常相似,都能模拟方法的各种行为。不同之处在于MockBean是全新的对象,跟正式对象没有关系;而SpyBean与正式对象紧密联系,可以模拟正式对象的部分方法,没有被模拟的方法仍然可以运行正式代码。VNQ28资讯网——每日最新资讯28at.com

@MockBean 只能 mock 本地的代码——或者说是自己写的代码,对于储存在库中而且又是以 Bean 的形式装配到代码中的类无能为力。VNQ28资讯网——每日最新资讯28at.com

@SpyBean 解决了 SpringBoot 的单元测试中VNQ28资讯网——每日最新资讯28at.com

@MockBean 不能 mock 库中自动装配的 Bean 的局限VNQ28资讯网——每日最新资讯28at.com

2.2.3 自动配置类型的注解(@AutoConfigure*)VNQ28资讯网——每日最新资讯28at.com

图片图片VNQ28资讯网——每日最新资讯28at.com

这些注解可以搭配@/*Test使用,用于开启在@/*Test中未自动配置的功能。例如@SpringBootTest和@AutoConfigureMockMvc组合后,就可以注入org.springframework.test.web.servlet.MockMvc。VNQ28资讯网——每日最新资讯28at.com

2.2.3.1 自动配置类型有两种使用方式VNQ28资讯网——每日最新资讯28at.com

a.在功能测试(即使用@SpringBootTest)时显示添加。VNQ28资讯网——每日最新资讯28at.com

b.一般在切片测试中被隐式使用,例如@WebMvcTest注解时,隐式添加了@AutoConfigureCacheVNQ28资讯网——每日最新资讯28at.com

@AutoConfigureWebMvcVNQ28资讯网——每日最新资讯28at.com

@AutoConfigureMockMvc。VNQ28资讯网——每日最新资讯28at.com

2.2.4 启动测试类型的注解VNQ28资讯网——每日最新资讯28at.com

所有的@*Test注解都被@BootstrapWith注解,它们可以启动。VNQ28资讯网——每日最新资讯28at.com

图片图片VNQ28资讯网——每日最新资讯28at.com

ApplicationContext,是测试的入口,所有的测试类必须声明一个@*Test注解。VNQ28资讯网——每日最新资讯28at.com

除了@SpringBootTest之外的注解都是用来进行切面测试的,他们会默认导入一些自动配置。一般情况下,推荐使用@SpringBootTest而非其它切片测试的注解,简单有效。若某次改动仅涉及特定切片,可以考虑使用切片测试。VNQ28资讯网——每日最新资讯28at.com

2.2.5 常用配置介绍VNQ28资讯网——每日最新资讯28at.com

@SpringBootTest,其中包含的配置项如下:VNQ28资讯网——每日最新资讯28at.com

图片图片VNQ28资讯网——每日最新资讯28at.com

@WebEnvironment,其中包含的配置项如下:VNQ28资讯网——每日最新资讯28at.com

图片图片VNQ28资讯网——每日最新资讯28at.com

Part 03、  Mockito框架 

3.1 常用的Mockito方法VNQ28资讯网——每日最新资讯28at.com

图片图片VNQ28资讯网——每日最新资讯28at.com

图片图片VNQ28资讯网——每日最新资讯28at.com

图片图片VNQ28资讯网——每日最新资讯28at.com

3.2 Mockito参数适配方法VNQ28资讯网——每日最新资讯28at.com

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()。VNQ28资讯网——每日最新资讯28at.com

Part 04、单元测试样例 

4.1 Mock redis、kafka方法VNQ28资讯网——每日最新资讯28at.com

方法1:VNQ28资讯网——每日最新资讯28at.com

@SpringBootTest通过@Resource引入对象测试,需要依赖redis环境(会启动spring boot 容器)

方法2:VNQ28资讯网——每日最新资讯28at.com

//声明变量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模拟登录方法VNQ28资讯网——每日最新资讯28at.com

<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") VNQ28资讯网——每日最新资讯28at.com

4.3 远程接口调用方法(Controller入口测试)VNQ28资讯网——每日最新资讯28at.com

  • MockMVC的基本步骤

(1) mockMvc.perform执行一个请求。VNQ28资讯网——每日最新资讯28at.com

(2) MockMvcRequestBuilders.get("XXX")构造一个请求。VNQ28资讯网——每日最新资讯28at.com

(3) ResultActions.param添加请求传值VNQ28资讯网——每日最新资讯28at.com

(4) ResultActions.accept()设置返回类型VNQ28资讯网——每日最新资讯28at.com

(5) ResultActions.andExpect添加执行完成后的断言。VNQ28资讯网——每日最新资讯28at.com

(6) ResultActions.andDo添加一个结果处理器,表示要对结果做点什么事情,比如处使用print()输出整个响应结果信息。VNQ28资讯网——每日最新资讯28at.com

(7) ResultActions.andReturn表示执行完成后返回相应的结果。VNQ28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-53020-0.htmlJava常用的单元测试框架介绍

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 基于Spring Cloud Eureka,三分钟搞懂服务发现

下一篇: 基于Spring Cloud Eureka,三分钟搞懂服务发现

标签:
  • 热门焦点
  • Mate60手机壳曝光 致敬自己的经典设计

    Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • 6月iOS设备性能榜:M2稳居榜首 A系列只能等一手3nm来救

    6月iOS设备性能榜:M2稳居榜首 A系列只能等一手3nm来救

    没有新品发布,自然iOS设备性能榜的上榜设备就没有什么更替,仅仅只有跑分变化而产生的排名变动,毕竟苹果新品的发布节奏就是这样的,一年下来也就几个移动端新品,不会像安卓厂商,一
  • Raft算法:保障分布式系统共识的稳健之道

    Raft算法:保障分布式系统共识的稳健之道

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可复制、可冗余、可容错”)的首字母缩写。Raft算法是一种用于在分布式系统
  • 服务存储设计模式:Cache-Aside模式

    服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 多线程开发带来的问题与解决方法

    多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • 小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    作者:黄河懂运营一条性教育视频,被54万人&ldquo;珍藏&rdquo;是什么体验?最近,情感博主@公主是用鲜花做的,火了!仅仅凭借一条视频,光小红书就有超过128万人,为她疯狂点赞!更疯狂的是,这
  • 重估百度丨大模型,能撑起百度的“今天”吗?

    重估百度丨大模型,能撑起百度的“今天”吗?

    自象限原创 作者|程心 罗辑2023年之前,对于自己的&ldquo;今天&rdquo;,百度也很迷茫。&ldquo;新业务到 2022 年底还是 0,希望 2023 年出来一个 1。&rdquo;这是2022年底,李彦宏
  • 微软发布Windows 11新版 引入全新任务栏状态

    微软发布Windows 11新版 引入全新任务栏状态

    近日,微软发布了Windows 11新版,而Build 22563更新主要引入了几周前曝光的平板模式任务栏等,系统更流畅了。更新中,Windows 11加入了专门针对平板优化的任务栏
  • SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘是西部数据发布的最新一代WD Blue系列的固态硬盘,不仅闪存技术更为精进,性能也得到了进一步的跃升。WD Blue SN570 NVMe SSD的包装外
Top