在使用 Maven 构建项目时,我们常在.pom中看到这样的配置:
plain
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.2</version>
<scope>test</scope> <!-- 关键在这里!-->
</dependency>

很多新手会疑惑:
● ❓ 为什么我在 main/java 下的类里导入 @Test 或 Assertions 会报错?
● ❓ 为什么执行 mvn package 时,测试类没有被运行?
● ❓ 如果把 test 注释掉,是不是就能在 main 里用了?
本文通过 IDEA 实操截图 + 原理讲解,一次性帮你彻底搞懂!
本文通过 IDEA 实操截图 + 原理讲解,一次性帮你彻底搞懂!
🔍 一、test 的作用是什么?
它表示:该依赖仅在编译和运行测试代码时有效,在主程序(main)中不可见。
✅ 正确用法:
● 在 src/test/java/.../*Test.java 文件中正常使用 JUnit、Mockito 等测试框架。
● 示例:
plain
// src/test/java/com/itheima/UserServiceTest.java
@Test
void test1() {
System.out.println("test1");
}
❌ 错误用法:
在 src/main/java/.../HelloWorld.java 中尝试使用 @Test → 编译报错!

原因:Maven 根据 scope 控制依赖的可见性,test 范围的依赖不会加入最终打好的 jar/war 包,也不会暴露给 main 源码。
🧪**** 二、实操演示:注释掉 scope 会发生什么?
如果你注释掉或删除:

plain
<!-- <scope>test</scope> -->
那么 JUnit 依赖就变成了默认 scope(compile),可以在 main 中使用了!

总结:
scope是 Maven 为测试代码划定的"安全区"------既保证测试依赖不污染生产代码,又支持灵活控制是否执行测试。
别再盲目删除它啦!理解其原理,才能写出更规范、更高效的 Maven 项目 👍
📎 参考资料
- Maven Dependencies Scope 官方文档
- IntelliJ IDEA Maven 插件行为说明