2024年Java最新JUnit5学习之八:综合进阶(终篇),Java编程书籍推荐

最后

即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!

我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:

Dubbo面试专题

JVM面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Java并发面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Kafka面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MongDB面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MyBatis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MySQL面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Netty面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

RabbitMQ面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Redis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Spring Cloud面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

SpringBoot面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

zookeeper面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

常见面试算法题汇总专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

计算机网络基础专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

设计模式专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

org.springframework.boot

spring-boot-starter-test

test

org.junit.jupiter

junit-jupiter

  1. 添加junit-jupiter依赖,此时会使用dependencyManagement中指定的版本号:

org.junit.jupiter

junit-jupiter

test

  1. 如下图,刷新可见已经用上了5.7.0版本:

在这里插入图片描述

  • 版本问题解决了,接下来正式进入进阶实战;

测试方法展现名称生成器(Display Name Generators)

  1. 把Display Name Generators翻译成测试方法展现名称生成器,可能刷新了读者们对本文作者英文水平的认知,请您多包含…

  2. 先回顾一下如何指定测试方法的展现名称,如果测试方法使用了@DisplayName,在展示单元测试执行结果时,就会显示@DisplayName指定的字符串,如下图所示:

在这里插入图片描述

  1. 除了用@DisplayName指定展示名称,JUnit5还提供了一种自动生成展示名称的功能:@DisplayNameGeneration,来看看它是如何生成展示名称的;

  2. 演示代码如下所示,当@DisplayNameGeneration的value设置为ReplaceUnderscores时,会把方法名的所有下划线替换为空格:

package com.bolingcavalry.advanced.service.impl;

import org.junit.jupiter.api.DisplayNameGeneration;

import org.junit.jupiter.api.DisplayNameGenerator;

import org.junit.jupiter.api.Test;

import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest

@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)

public class ReplaceUnderscoresTest {

@Test

void if_it_is_zero() {

}

}

  1. 执行结果如下图,方法if_it_is_zero展示出的名字为if it is zero:

在这里插入图片描述

  1. 在上述替换方式的基础上,JUnit5还提供了另一种生成展示名称的方法:测试类名+连接符+测试方法名,并且类名和方法名的下划线都会被替换成空格,演示代码如下,使用了注解@IndicativeSentencesGeneration,其separator属性就是类名和方法名之间的连接符:

package com.bolingcavalry.advanced.service.impl;

import org.junit.jupiter.api.DisplayNameGenerator;

import org.junit.jupiter.api.IndicativeSentencesGeneration;

import org.junit.jupiter.api.Test;

import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest

@IndicativeSentencesGeneration(separator = “,测试方法:”, generator = DisplayNameGenerator.ReplaceUnderscores.class)

public class IndicativeSentences_Test {

@Test

void if_it_is_one_of_the_following_years() {

}

}

  1. 执行结果如下:

在这里插入图片描述

重复测试(Repeated Tests)

  1. 重复测试就是指定某个测试方法反复执行多次,演示代码如下,可见@Test已被@RepeatedTest(5)取代,数字5表示重复执行5次:

@Order(1)

@DisplayName(“重复测试”)

@RepeatedTest(5)

void repeatTest(TestInfo testInfo) {

log.info(“测试方法 [{}]”, testInfo.getTestMethod().get().getName());

}

  1. 执行结果如下图:

在这里插入图片描述

  1. 在测试方法执行时,如果想了解当前是第几次执行,以及总共有多少次,只要给测试方法增加RepetitionInfo类型的入参即可,演示代码如下,可见RepetitionInfo提供的API可以得到总数和当前次数:

@Order(2)

@DisplayName(“重复测试,从入参获取执行情况”)

@RepeatedTest(5)

void repeatWithParamTest(TestInfo testInfo, RepetitionInfo repetitionInfo) {

log.info(“测试方法 [{}],当前第[{}]次,共[{}]次”,

testInfo.getTestMethod().get().getName(),

repetitionInfo.getCurrentRepetition(),

repetitionInfo.getTotalRepetitions());

}

  1. 上述代码执行结果如下:

在这里插入图片描述

  1. 在上图的左下角可见,重复执行的结果被展示为"repetition X of X"这样的内容,其实这部分信息是可以定制的,就是RepeatedTest注解的name属性,演示代码如下,可见currentRepetition和totalRepetitions是占位符,在真正展示的时候会被分别替换成当前值和总次数:

@Order(3)

@DisplayName(“重复测试,使用定制名称”)

@RepeatedTest(value = 5, name=“完成度:{currentRepetition}/{totalRepetitions}”)

void repeatWithCustomDisplayNameTest(TestInfo testInfo, RepetitionInfo repetitionInfo) {

log.info(“测试方法 [{}],当前第[{}]次,共[{}]次”,

testInfo.getTestMethod().get().getName(),

repetitionInfo.getCurrentRepetition(),

repetitionInfo.getTotalRepetitions());

}

  1. 上述代码执行结果如下:

在这里插入图片描述

嵌套测试(Nested Tests)

  1. 如果一个测试类中有很多测试方法(如增删改查,每种操作都有多个测试方法),那么不论是管理还是结果展现都会显得比较复杂,此时嵌套测试(Nested Tests)就派上用场了;

  2. 嵌套测试(Nested Tests)功能就是在测试类中创建一些内部类,以增删改查为例,将所有测试查找的方法放入一个内部类,将所有测试删除的方法放入另一个内部类,再给每个内部类增加@Nested注解,这样就会以内部类为单位执行测试和展现结果,如下图所示:

在这里插入图片描述

  1. 嵌套测试的演示代码如下:

package com.bolingcavalry.advanced.service.impl;

import lombok.extern.slf4j.Slf4j;

import org.junit.jupiter.api.DisplayName;

import org.junit.jupiter.api.Nested;

import org.junit.jupiter.api.Test;

import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest

@Slf4j

@DisplayName(“嵌套测试演示”)

public class NestedTest {

@Nested

@DisplayName(“查找服务相关的测试”)

class FindService {

@Test

void findByIdTest() {}

@Test

void findByNameTest() {}

}

@Nested

@DisplayName(“删除服务相关的测试”)

class DeleteService {

@Test

void deleteByIdTest() {}

@Test

void deleteByNameTest() {}

}

}

  1. 上述代码执行结果如下,可见从代码管理再到执行和结果展示,都被分组管理了:

在这里插入图片描述

动态测试(Dynamic Tests)

  1. 之前咱们写的测试方法,主要是用@Test修饰,这些方法的特点就是在编译阶段就已经明确了,在运行阶段也已经固定;

  2. JUnit5推出了另一种类型的测试方法:动态测试(Dynamic Tests),首先,测试方法是可以在运行期间被生产出来的,生产它们的地方,就是被@TestFactory修饰的方法,等到测试方法被生产出来后再像传统的测试方法那样被执行和结果展示;

  3. 下面是演示代码,testFactoryTest方法被@TestFactory修饰,返回值是Iterable类型,里面是多个DynamicTest实例,每个DynamicTest实例代表一个测试方法,因此,整个DynamicDemoTest类中有多少个测试方法,在编译阶段是不能确定的,只有在运行阶段执行了testFactoryTest方法后,才能根据返回值确定下来:

package com.bolingcavalry.advanced.service.impl;

import lombok.extern.slf4j.Slf4j;

import org.junit.jupiter.api.DynamicTest;

import org.junit.jupiter.api.TestFactory;

import org.springframework.boot.test.context.SpringBootTest;

import java.util.Arrays;

import static org.junit.jupiter.api.DynamicTest.dynamicTest;

@SpringBootTest

@Slf4j

class DynamicDemoTest {

@TestFactory

Iterable<org.junit.jupiter.api.DynamicTest> testFactoryTest() {

DynamicTest firstTest = dynamicTest(

“一号动态测试用例”,

() -> {

log.info(“一号用例,这里编写单元测试逻辑代码”);

}

);

DynamicTest secondTest = dynamicTest(

“二号动态测试用例”,

() -> {

log.info(“二号用例,这里编写单元测试逻辑代码”);

}

);

return Arrays.asList(firstTest, secondTest);

}

}

  1. 上述代码的执行结果如下,可见每个DynamicTest实例就相当于以前的一个@Test修饰的方法,会被执行和统计:

在这里插入图片描述

多线程并发执行(Parallel Execution)的介绍

  • 《JUnit5学习》系列的最后,咱们来看一个既容易理解又实用的特性:多线程并发执行(Parallel Execution)

  • JUnit5中的并发执行测试可以分为以下三种场景:

  1. 多个测试类,它们各自的测试方法同时执行;

  2. 一个测试类,里面的多个测试方法同时执行;

  3. 一个测试类,里面的一个测试方法,在重复测试(Repeated Tests)或者参数化测试(Parameterized Tests)的时候,这个测试方法被多个线程同时执行;

多线程并发执行(Parallel Execution)实战

  1. 前面介绍了多线程并发执行有三种场景,文章篇幅所限就不逐个编码实战了,就选择第三种场景来实践吧,即:一个测试类里面的一个测试方法,在重复测试时多线程并发执行,至于其他两种场景如何设置,接下来的文中也会讲清楚,您自行实践即可;

  2. 首先是创建JUnit5的配置文件,如下图,在test文件夹上点击鼠标右键,在弹出的菜单选择"New"->“Directory”:

在这里插入图片描述

  1. 弹出的窗口如下图,双击红框位置的"resources",即可新建resources目录:

在这里插入图片描述

  1. 在新增的resources目录中新建文件junit-platform.properties,内容如下,每个配置项都有详细的说明:

并行开关true/false

junit.jupiter.execution.parallel.enabled=true

总结:心得体会

既然选择这个行业,选择了做一个程序员,也就明白只有不断学习,积累实战经验才有资格往上走,拿高薪,为自己,为父母,为以后的家能有一定的经济保障。

学习时间都是自己挤出来的,短时间或许很难看到效果,一旦坚持下来了,必然会有所改变。不如好好想想自己为什么想进入这个行业,给自己内心一个答案。

面试大厂,最重要的就是夯实的基础,不然面试官随便一问你就凉了;其次会问一些技术原理,还会看你对知识掌握的广度,最重要的还是你的思路,这是面试官比较看重的。

最后,上面这些大厂面试真题都是非常好的学习资料,通过这些面试真题能够看看自己对技术知识掌握的大概情况,从而能够给自己定一个学习方向。包括上面分享到的学习指南,你都可以从学习指南里理顺学习路线,避免低效学习。

大厂Java架构核心笔记(适合中高级程序员阅读):

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

:心得体会

既然选择这个行业,选择了做一个程序员,也就明白只有不断学习,积累实战经验才有资格往上走,拿高薪,为自己,为父母,为以后的家能有一定的经济保障。

学习时间都是自己挤出来的,短时间或许很难看到效果,一旦坚持下来了,必然会有所改变。不如好好想想自己为什么想进入这个行业,给自己内心一个答案。

面试大厂,最重要的就是夯实的基础,不然面试官随便一问你就凉了;其次会问一些技术原理,还会看你对知识掌握的广度,最重要的还是你的思路,这是面试官比较看重的。

最后,上面这些大厂面试真题都是非常好的学习资料,通过这些面试真题能够看看自己对技术知识掌握的大概情况,从而能够给自己定一个学习方向。包括上面分享到的学习指南,你都可以从学习指南里理顺学习路线,避免低效学习。

大厂Java架构核心笔记(适合中高级程序员阅读):

[外链图片转存中…(img-XSH1VkHS-1714922463587)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 14
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值