JUnit单元测试
简介
JUnit是一个开源的java语言的单元测试框架
专门针对java语言设计, 使用最广泛, JUnit是标准的单元测试架构
java单元测试是最小的功能单元测试代码, 单元测试就是针对单个java方法的测试
目的
-
确保单个方法正常运行
-
测试代码可以作为示例代码
-
可以自动化运行所有测试并获得报告
Maven依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
项目结构

断言
在 JDK 1.4 之后,Java 中增加了断言的功能,关键字assert
断言是java的一种语句,它允许对程序提出一个判断(假设)。断言包含一个布尔表达式,在程序运行中它应该是真。假设程序期望得到某个结果,如果没达成则报错。断言用于确保程序的正确性,避免逻辑错误。
与异常处理类似,断言不能代替正常的检验,只是检测内部的一致性和有效性。断言在运行是检验,可以在程序启动时打开或关闭。
PS:不要在正常的业务逻辑中使用断言。对于程序正确性的判断可以在测试环境使用断言,生成环境则可以关闭该功能。
期望之外的结果:
import org.junit.Assert;
/**
* @author wzm
* @version 1.0.0
* @date 2020/1/24 15:25
**/
public class MyTest {
private static void test(int x) {
int c = 10 + 20;
int a = 12 * 100 / x;
Assert.assertTrue("expected a == c ,but a != c", a == c);
System.out.println("a == c");
}
public static void main(String[] args) {
int x = 10;
test(x);
}
}
报错如下:

期望的结果:
import org.junit.Assert;
/**
* @author wzm
* @version 1.0.0
* @date 2020/1/24 15:25
**/
public class MyTest {
private static void test(int x) {
int c = 10 + 20;
int a = 12 * 100 / x;
Assert.assertTrue("expected a == c ,but a != c", a == c);
System.out.println("a == c");
}
public static void main(String[] args) {
int x = 40;
test(x);
}
}
运行结果:
断言还有很多其他方法。
assertTrue
assertFalse
assertEquals
assertNotEquals
assertArrayEquals
...
开启断言

在VM options中输入-ea开启断言功能
junit注解
@Before:初始化测试资源
@After:释放测试资源
@BeforeClass: 初始化非常耗时的资源, 例如创建数据库
@AfterClass: 清理@BeforeClass创建的资源, 例如数据库资源
@Test:执行测试的主体
执行顺序
import org.junit.*;
public class MyTestTest {
public MyTestTest() {
System.out.println("--new MyTestTest()");
}
@BeforeClass
public static void setUpBeforeClass() {
System.out.println("--BeforeClass()");
}
@AfterClass
public static void tearDownAfterClass() {
System.out.println("--AfterClass()");
}
@Before
public void setUp() {
System.out.println("--Before()");
}
@After
public void tearDown() {
System.out.println("--After()");
}
@Test
public void testA() {
System.out.println("--testA()");
}
@Test
public void testB() {
System.out.println("--testB()");
}
@Test
public void testC() {
System.out.println("--testC()");
}
}
运行整个类,执行结果:

运行单个测试testA:

超时测试
@Test(timeout=1000)可以设置超时时间
timeout单位是毫秒
@Test(timeout = 1000)
public void testA() {
System.out.println("--testA()");
}
异常测试
异常测试可以通过@Test(expected=Exception.class), 对可能发生的每种类型的异常进行测试
-
如果抛出了指定类型的异常, 测试成功
-
如果没有抛出指定类型的异常, 或者抛出的异常类型不对, 测试失败
运行如下代码: 正常通过,证明确实发生了ArithmeticException异常
@Test(expected = ArithmeticException.class)
public void testException() {
int i = 1 / 0;
}
运行如下代码: 有报错信息,代表没有报错或者报的是其他的错误。
@Test(expected = ArithmeticException.class)
public void testException() {
int i = 1 / 1;
}
执行结果如下:
java.lang.AssertionError: Expected exception: java.lang.ArithmeticException
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」