总结
面试难免让人焦虑不安。经历过的人都懂的。但是如果你提前预测面试官要问你的问题并想出得体的回答方式,就会容易很多。
此外,都说“面试造火箭,工作拧螺丝”,那对于准备面试的朋友,你只需懂一个字:刷!
给我刷刷刷刷,使劲儿刷刷刷刷刷!今天既是来谈面试的,那就必须得来整点面试真题,这不花了我整28天,做了份“Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法等”
且除了单纯的刷题,也得需准备一本【JAVA进阶核心知识手册】:JVM、JAVA集合、JAVA多线程并发、JAVA基础、Spring 原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB、Cassandra、设计模式、负载均衡、数据库、一致性算法、JAVA算法、数据结构、加密算法、分布式缓存、Hadoop、Spark、Storm、YARN、机器学习、云计算,用来查漏补缺最好不过。
package com.yer.boot;
import org.junit.jupiter.api.*;
@DisplayName(“junit5 功能测试类”)
public class JUnit5Test {
@DisplayName(“测试displayname注解”)
@Test
void testDisplayName() {
System.out.println(999);
}
@DisplayName(“测试displayname注解2”)
@Test
void testDisplayName2() {
System.out.println(9992);
}
@BeforeEach
//每个单元测试之前都要执行
void testBeforeEach() {
System.out.println(“测试要开始了!”);
}
@AfterEach
//每个单元测试之后都要执行
void testAfterEach() {
System.out.println(“测试结束了”);
}
@BeforeAll
static void testBeforeAll() {
System.out.println(“要测试所有测试了”);
}
@AfterAll
static void testAfterAll() {
System.out.println(“所有测试测试完了”);
}
}
-
@Tag 表示单元测试类别,类似于JUni4中的@Categories
-
@Disable 不用执行
- @Timeout
/**
-
规定方法的超时时间
-
超出时间测试异常
-
@throws InterruptedException
*/
@Timeout(value = 500,unit = TimeUnit.MILLISECONDS)
@Test
void testTimeout() throws InterruptedException {
Thread.sleep(1000);
}
- @ExtendWIth:为测试类或测试方法提供扩展类引用 (类似于junit4@RunWith)
@SpringBootTest 复合注解中有@ExtendWIth(SpringExtension.class)
- @RepeatTest(8) 重复测试
断言是测试方法中的核心部分,用来对测试需要满足的条件进行验证
这些断言方法都是org.junit.jupiter.api.Assertions中的静态方法
JUnit5 内置的断言可以分成以下几个类别:检查业务逻辑返回的数据是否合理
得益于断言机制,所有的测试结束之后会有一个详细报告
1.简单断言
对单个值进行简单验证
@DisplayName(“测试简单断言”)
@Test
void testSimpleAssertions(){
int cal = cal(3,3);
assertEquals(6,cal);
}
int cal(int i,int j){
return i+j;
}
//成功
=======================================
/**
-
断言
-
前面断言失败,后面代码不会执行
*/
@DisplayName(“测试简单断言”)
@Test
void testSimpleAssertions(){
int cal = cal(2,3);
assertEquals(6,cal,“业务逻辑计算失败”);
Object o1 = new Object();
Object o2 = new Object();
assertEquals(o1,o2,“两个对象不一样”);
}
int cal(int i,int j){
return i+j;
}
2.数组断言
来判断两个对象或者原始类型的数组是否相等
@Test
@DisplayName(“array assertion”)
public void array(){
assertArrayEquals(new int[]{1,2},new int{1,2});
}
3.组合断言
assertAll方法接收多个org.junit.jupiter.api.Executable函数式接口的实例作为要验证的断言,可以通过lambda表达式 很容易的提供这些断言
@Test
@DisplayName(“组合断言”)
void all(){
assertAll(“test”,
()->assertTrue(true&&true,“结果不为true”),
()->assertEquals(1,1,“结果不为1”));
system.out.println(“两个断言都成功才可以输出”)
}
4.异常断言
在junit4时期 ,想要检测方法异常情况时,需要用注解@Rule注解的@ExpectedException变量还是比较麻烦的。相对于现在的Junit5提供了一种新的断言方式Assertions.assertThrows(),配合函数式编程就可以进行使用
断定业务逻辑一定出现异常
@Test
@DisplayName(“异常断言”)
void testException(){
assertThrows(ArithmeticException.class,
()-> { int i = 1/0;},“业务逻辑竟然能正常运行,不是吧”);
}
5.超时断言
还提供了Assertions.assertTimout()为测试方法设置了超时时间
@Test
@DisplayName(“超时断言”)
public void timeOut(){
//如果测试方法时间超过1s
Assertions.assertTimeout(Duration.ofMillis(1000),
()->Thread.sleep(500));
}
6.快速失败
通过fail方法直接使得测试失败
@Test
@DisplayName(“快速失败”)
void testFai(){
if (2 == 2 ){
fail(“测试失败”);
}
}
三,前置条件(assumptions)
JUnit5中的前置条件(assunption假设)类似于断言,不同之处在于不满足的断言会使得测试方法失败,而不满足的前置条件只会使得测试方法执行终止。
前置条件爱你可以堪称是测试方法执行的前提,当该前提不满足时,就没有继续执行的必要l
@DisplayName(“测试前置条件”)
@Test
void testAsummptions(){
Assumptions.assumeTrue(false,“结果不是true”);
System.out.println(“为true”);
}
disable 跳过
假设失败跳过
四,嵌套测试
-----------可参考官方文档
junit可以通过加入了嵌套测试
嵌套测试情况下
外层的Test不能驱动内层的Before(After)Each/All主类的方法提前/之后运行
内层的可以驱动外层的
package com.yer.boot;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import java.util.EmptyStackException;
import java.util.Stack;
import static org.junit.jupiter.api.Assertions.*;
@DisplayName(“嵌套测试”)
public class TestAStackDemo {
Stack stack;
@Test
@DisplayName(“new Stack()”)
void isInstantiatedWithNew() {
new Stack<>();
}
@Nested
@DisplayName(“when new”)
class WhenNew {
@BeforeEach
void createNewStack() {
stack = new Stack<>();
}
@Test
@DisplayName(“is empty”)
void isEmpty() {
assertTrue(stack.isEmpty());
}
@Test
@DisplayName(“throws EmptyStackException when popped”)
void throwsExceptionWhenPopped() {
assertThrows(EmptyStackException.class, stack::pop);
}
@Test
@DisplayName(“throws EmptyStackException when peeked”)
void throwsExceptionWhenPeeked() {
assertThrows(EmptyStackException.class, stack::peek);
}
@Nested
@DisplayName(“after pushing an element”)
class AfterPushing {
String anElement = “an element”;
@BeforeEach
void pushAnElement() {
stack.push(anElement);
}
@Test
@DisplayName(“it is no longer empty”)
void isNotEmpty() {
assertFalse(stack.isEmpty());
}
@Test
@DisplayName(“returns the element when popped and is empty”)
void returnElementWhenPopped() {
assertEquals(anElement, stack.pop());
assertTrue(stack.isEmpty());
}
@Test
总结
无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。
最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。
(“returns the element when popped and is empty”)
void returnElementWhenPopped() {
assertEquals(anElement, stack.pop());
assertTrue(stack.isEmpty());
}
@Test
总结
无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。
最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。
[外链图片转存中…(img-9E8LsozH-1715574773377)]