分享
这次面试我也做了一些总结,确实还有很多要学的东西。相关面试题也做了整理,可以分享给大家,了解一下面试真题,想进大厂的或者想跳槽的小伙伴不妨好好利用时间来学习。学习的脚步一定不能停止!
Spring Cloud实战
Spring Boot实战
面试题整理(性能优化+微服务+并发编程+开源框架+分布式)
-
从上图可见,整个JUnit5可以划分成三层:顶层框架(Framework)、中间的引擎(Engine),底层的平台(Platform);
-
官方定义JUnit5由三部分组成:Platform、Jupiter、Vintage,功能如下;
-
Platform:位于架构的最底层,是JVM上执行单元测试的基础平台,还对接了各种IDE(例如IDEA、eclipse),并且还与引擎层对接,定义了引擎层对接的API;
-
Jupiter:位于引擎层,支持5版本的编程模型、扩展模型;
-
Vintage:位于引擎层,用于执行低版本的测试用例;
- 可见整个Junit Platform是开放的,通过引擎API各种测试框架都可以接入;
SpringBoot对JUnit5的依赖
- 这里使用SpringBoot版本为2.3.4.RELEASE,在项目的pom.xml中依赖JUnit5的方法如下:
org.springframework.boot
spring-boot-starter-test
test
- 如下图红框,可见JUnit5的jar都被spring-boot-starter-test间接依赖进来了:
曾经的RunWith注解
- 在使用JUnit4的时候,咱们经常这么写单元测试类:
@RunWith(SpringRunner.class)
@SpringBootTest
public class XXXTest {
- 对于上面的RunWith注解,JUnit5官方文档的说法如下图红框所示,已经被ExtendWith取代:
- 咱们再来看看SpringBootTest注解,如下图,可见已经包含了ExtendWith:
- 综上所述,SpringBoot+JUnit5时,RunWith注解已经不需要了,正常情况下仅SpringBootTest注解即可,如果对扩展性有更多需求,可以添加ExtendWith注解,如下图:
常用的JUnit5注解(SpringBoot环境)
注意,接下来提到的测试方法,是指当前class中所有被@Test、@RepeatedTest、@ParameterizedTest、@TestFactory修饰的方法;
-
ExtendWith:这是用来取代旧版本中的RunWith注解,不过在SpringBoot环境如果没有特别要求无需额外配置,因为SpringBootTest中已经有了;
-
Test:被该注解修饰的就是测试方法;
-
BeforeAll:被该注解修饰的必须是静态方法,会在所有测试方法之前执行,会被子类继承,取代低版本的BeforeClass;
-
AfterAll:被该注解修饰的必须是静态方法,会在所有测试方法执行之后才被执行,会被子类继承,取代低版本的AfterClass;
-
BeforeEach:被该注解修饰的方法会在每个测试方法执行前被执行一次,会被子类继承,取代低版本的Before;
-
AfterEach:被该注解修饰的方法会在每个测试方法执行后被执行一次,会被子类继承,取代低版本的Before;
-
DisplayName:测试方法的展现名称,在测试框架中展示,支持emoji;
-
Timeout:超时时长,被修饰的方法如果超时则会导致测试不通过;
-
Disabled:不执行的测试方法;
5版本已废弃的注解
以下的注解都是在5之前的版本使用的,现在已经被废弃:
| 被废弃的注解 | 新的继任者 |
| — | — |
| Before | BeforeEach |
| After | AfterEach |
| BeforeClass | BeforeAll |
| AfterClass | AfterAll |
| Category | Tag |
| RunWith | ExtendWith |
| Rule | ExtendWith |
| ClassRule | RegisterExtension |
版本和环境信息
整个系列的编码和执行在以下环境进行,供您参考:
-
硬件配置:处理器i5-8400,内存32G,硬盘128G SSD + 500G HDD
-
操作系统:Windows10家庭中文版
-
IDEA:2020.2.2 (Ultimate Edition)
-
JDK:1.8.0_181
-
SpringBoot:2.3.4.RELEASE
-
JUnit Jupiter:5.6.2
接下来开始实战,咱们先建好SpringBoot项目;
关于lombok
为了简化代码,项目中使用了lombok,请您在IDEA中安装lombok插件;
源码下载
- 如果您不想编码,可以在GitHub下载所有源码,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos):
| 名称 | 链接 | 备注 |
| :-- | :-- | :-- |
| 项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |
| git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 |
| git仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 |
- 这个git项目中有多个文件夹,本章的应用在junitpractice文件夹下,如下图红框所示:
- junitpractice是父子结构的工程,本篇的代码在junit5experience子工程中,如下图:
创建Maven父工程
-
为了便于管理整个系列的源码,在此建立名为junitpractice的maven工程,后续所有实战的源码都作为junitpractice的子工程;
-
junitpractice的pom.xml如下,可见是以SpringBoot的2.3.4.RELEASE版本作为其父工程:
<project xmlns=“http://maven.apache.org/POM/4.0.0”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>
4.0.0
simplebean
org.springframework.boot
spring-boot-starter-parent
2.3.4.RELEASE
com.bolingcavalry
junitpractice
1.0-SNAPSHOT
pom
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
org.projectlombok
lombok
1.16.16
本篇的源码工程
接下来咱们准备一个简单的SpringBoot工程用于做单元测试,该工程有service和controller层,包含一些简单的接口和类;
- 创建名为junit5experience的子工程,pom.xml如下,注意单元测试要依赖spring-boot-starter-test:
<project xmlns=“http://maven.apache.org/POM/4.0.0” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd”>
4.0.0
com.bolingcavalry
junitpractice
1.0-SNAPSHOT
…/pom.xml
com.bolingcavalry
junit5experience
0.0.1-SNAPSHOT
junit5experience
Demo project for simplebean in Spring Boot junit5
<java.version>1.8</java.version>
org.springframework.boot
spring-boot-starter-web
org.projectlombok
lombok
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-starter-webflux
test
org.springframework.boot
spring-boot-maven-plugin
- 写一些最简单的业务代码,首先是service层的接口HelloService.java:
package com.bolingcavalry.junit5experience.service;
public interface HelloService {
String hello(String name);
int increase(int value);
/**
-
该方法会等待1秒后返回true,这是在模拟一个耗时的远程调用
-
@return
*/
boolean remoteRequest();
}
- 上述接口对应的实现类如下,hello和increase方法分别返回String型和int型,remoteRequest故意sleep了1秒钟,用来测试Timeout注解的效果:
package com.bolingcavalry.junit5experience.service.impl;
import com.bolingcavalry.junit5experience.service.HelloService;
import org.springframework.stereotype.Service;
@Service()
public class HelloServiceImpl implements HelloService {
@Override
public String hello(String name) {
return "Hello " + name;
}
@Override
public int increase(int value) {
return value + 1;
}
@Override
public boolean remoteRequest() {
try {
Thread.sleep(1000);
} catch (InterruptedException interruptedException) {
interruptedException.printStackTrace();
}
return true;
}
}
- 添加一个简单的controller:
package com.bolingcavalry.junit5experience.controller;
import com.bolingcavalry.junit5experience.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
写在最后
作为一名即将求职的程序员,面对一个可能跟近些年非常不同的 2019 年,你的就业机会和风口会出现在哪里?在这种新环境下,工作应该选择大厂还是小公司?已有几年工作经验的老兵,又应该如何保持和提升自身竞争力,转被动为主动?
就目前大环境来看,跳槽成功的难度比往年高很多。一个明显的感受:今年的面试,无论一面还是二面,都很考验Java程序员的技术功底。
最近我整理了一份复习用的面试题及面试高频的考点题及技术点梳理成一份“Java经典面试问题(含答案解析).pdf和一份网上搜集的“Java程序员面试笔试真题库.pdf”(实际上比预期多花了不少精力),包含分布式架构、高可扩展、高性能、高并发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多个知识点高级进阶干货!
由于篇幅有限,为了方便大家观看,这里以图片的形式给大家展示部分的目录和答案截图!
Java经典面试问题(含答案解析)
阿里巴巴技术笔试心得
包含分布式架构、高可扩展、高性能、高并发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多个知识点高级进阶干货!*
由于篇幅有限,为了方便大家观看,这里以图片的形式给大家展示部分的目录和答案截图!
[外链图片转存中…(img-jXTQVPpZ-1715150906436)]
Java经典面试问题(含答案解析)
[外链图片转存中…(img-1t26OoJR-1715150906436)]
阿里巴巴技术笔试心得
[外链图片转存中…(img-qht19LfE-1715150906437)]