JUnit
JUnit 是一个用于 Java 编程语言的单元测试框架,广泛用于开发和测试 Java 应用程序。它允许开发者编写和运行重复的测试,以确保代码质量和功能正确性。
概念
-
测试 test:发现问题;
-
调试 debug:解决问题;
-
单元测试:测试小的代码单元(如方法)以验证其是否按预期工作。
测试用例:由一个或多个断言组成的测试代码,用于验证某个功能的正确性。
测试套件:一个组合多个测试用例的集合,可以一起运行。
JUnit 3(4/5) 注解
-
@Before: 被@Before修饰的方法,在每个测试方法运行前,均执行一次;
-
@After:被@After修饰的方法,在每个测试方法运行完毕后,均执行一次;
1.@Before和@After可以出现多次; 2.经这两个注释的初始化和注销,可以保证各个测试之间的独立性而互不干扰,他的缺点是效率低。
-
@BeforeClass:所有测试开始之前运行
-
@AfterClass :所有测试结束之后运行
-
@Test:被注解的方法是测试方法
-
@Test(expected=*.class) 通过传入异常类后,测试类如果没有抛出异常或者抛出一个不同的异常,本测试方法就将失败。
-
@Test(timeout=xxx) 如果测试方法在制定的时间(毫秒)之内没有运行完,则测试失败。
-
-
@ignore: 该元数据标记的测试方法在测试中会被忽略。
测试类
-
测试类是一个独立的类,没有任何父类。测试类的名字可以任意命名。所以我们不能通过类的声明来判断它是不是一个测试类,它与普通类的区别在于它内部方法的声明。
-
测试类中,并不是每一个方法都是用于测试的,你必须使用“注解”来明确表明哪些是测试方法。
-
测试方法的名字可以随便取,没有限制,但是返回值必须为void,而且不能有任何参数。
JUnit 基本用法
1. 添加依赖
在 Maven 项目中,可以通过以下依赖添加 JUnit:
2. 创建测试类
创建一个测试类,使用 @Test
注解标记测试方法:
3. 断言
JUnit 提供了多种断言方法来验证结果:
assertEquals(expected, actual)
assertTrue(condition)
assertFalse(condition)
assertThrows(exceptionClass, executable)
4. 使用生命周期方法
可以使用注解 @BeforeEach
和 @AfterEach
来定义在每个测试方法前后执行的代码:
5. 测试异常
如果希望测试某个方法抛出特定异常,可以使用 assertThrows
方法
Lambda
函数式接口
抽象方法仅有一个的接口,被称作函数式接口。函数式接口中非抽象方法(默认方法、静态方法)个数不限。JDK8 新增了 @FunctionalInterface
注解表示函数式接口。
@FunctionalInterface public interface MathOperation { double operate(int a, int b); } @FunctionalInterface public interface Runnable { void run(); }
-
JDK8 提供的
java.util.funciton
包,其中的接口都为 函数式接口。 -
四大函数式接口:
函数式接口 接口中定义的唯一抽象方法 含义 Consumer void accept(T t) 有输入参数,无返回值,称为消费型接口。 Supplier T get() 无输入参数,有返回值,称为供给型接口。 Function<T, R> R apply(T t) 有输入参数,有返回值,称为函数型接口。 Predicate boolean test(T t); 对输入进行断言,并将断言的结果以布尔形式返回,称为断言型接口。
Lambda 表达式
Lambda表达式是 JDK8 中提供的一个新特性,是一个匿名方法 ,而匿名方法是由参数列表和方法体两部分组成的,Lambda 表达式也必须包含这两部分:(参数列表) -> { 方法体 }
函数式接口 变量名 = (参数1,参数2,...) -> { 方法体 }
-
(参数1,参数2…)表示参数列表;->表示连接符;{}内部是方法体
-
= 右边的对象类型会根据左边的函数式接口类型自动推断;
-
参数只有一个时,括号()可省;无参或多参时都不可省。
-
形参列表的数据类型会自动推断,因此参数类型的声明是可选的;
-
函数体如果只有一条语句,花括号和return语句都可省;反之则不能省,且花括号后需有分号;
-
lambda表达式 只能引用 final域外变量,被引用的域外变量即使没有被final修饰,也隐性的具有 final语义
方法引用
简化 Lambda 表达式。常见方法引用五种类型:
方法引用的类型 | 示例 |
---|---|
引用静态方法 | 类名 :: 静态方法名 |
引用某个对象的实例方法 | 对象名 :: 非静态方法 |
引用类中的实例方法 | 类名 :: 非静态方法 |
引用构造方法 | 类名:: new |
引用数组 | 元素类型[] :: new |