JUnit 5需同时配置junit-jupiter-api和junit-jupiter-engine,Mockito需同时配置mockito-core和mockito-junit-jupiter;漏配则@Test报红或无法运行;Maven中须彻底排除JUnit 4残留;IntelliJ需启用JUnit 5 runner并勾选Delegate to Gradle;@Mock生效必须搭配@ExtendWith(MockitoExtension.class)。

Gradle里怎么写JUnit 5和Mockito的依赖
JUnit 5不是单个jar,得拆成junit-jupiter-api(写测试用)、junit-jupiter-engine(运行测试用)两块;Mockito也得分mockito-core(主逻辑)和mockito-junit-jupiter(跟JUnit 5生命周期对接)。漏掉engine或mockito-junit-jupiter,测试根本跑不起来,连@Test都报红。
常见错误现象:org.junit.jupiter.api.Test能导入,但右键Run Test没反应;或者报错No tests found for given includes。
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.2'testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.2'testImplementation 'org.mockito:mockito-core:5.11.0'testImplementation 'org.mockito:mockito-junit-jupiter:5.11.0'
Maven中pom.xml的dependency写法容易错在哪
很多人复制老项目配置,把junit:junit:4.13.2留在test scope里,结果JUnit 5注解被当成无效语法——Maven不会自动排包冲突,JAR会共存,但类加载器优先加载了JUnit 4的Test类,导致@Test报错Cannot resolve symbol 'Test'或运行时抛java.lang.NoClassDefFoundError: org/junit/jupiter/api/Test。
必须显式排除JUnit 4残留:
立即学习“Java免费学习笔记(深入)”;
- 删掉所有含
groupId=junit且artifactId=junit的<dependency> - 检查父POM或BOM是否带入了旧版JUnit,用
mvn dependency:tree -Dincludes=junit确认 -
mockito-core和mockito-junit-jupiter版本号必须一致,否则@Mock注入失败,报MockitoException: No tests found
IntelliJ里测试类跑不起来,是不是插件没开
IntelliJ默认支持JUnit 5,但有两个隐藏开关:一是项目SDK必须是Java 8+(JUnit 5最低要求),二是要启用“JUnit 5 test runner”。如果看到Test class could not be found或右键菜单没有“Run ‘xxxTest’”,大概率是后者关了。
路径:File → Settings → Build, Execution, Deployment → Build Tools → Gradle → Runner → 勾选Delegate IDE build/run actions to Gradle(推荐),同时确保Test framework下拉框选的是JUnit 5。不勾这个,IDE用自己的Runner,会忽略junit-jupiter-engine配置。
- 新建测试类时,用
Ctrl+Shift+T快捷键生成,它默认用JUnit 5模板 - 如果手动建
.java文件,类名必须以Test结尾,且方法上写@Test,不能只写public void testXxx() - 别在
src/main/java里写测试——IntelliJ不会扫描那里
为什么@Mock注解不生效,对象还是null
这是Mockito + JUnit 5最典型的失配场景:@Mock本身只是标记,真正触发实例化靠的是@ExtendWith(MockitoExtension.class)或@MockitoSettings。没加扩展,字段永远是null,调用就NPE。
常见错误现象:断点进测试方法,@Mock UserService service显示service = null;或者when(service.get(1)).thenReturn(...)直接抛NullPointerException。
- 每个测试类顶部必须加
@ExtendWith(MockitoExtension.class)(注意是org.mockito.junit.jupiter.MockitoExtension,不是org.mockito.junit.MockitoJUnit) - 字段声明必须是
private,不能final,不能static - 如果用了
@BeforeEach,确保它在@ExtendWith之后执行——MockitoExtension会自动处理@Mock和@InjectMocks字段初始化
复杂点在于,一旦混用SpringBootTest,@MockBean和@Mock会打架,这时候该用哪个、能不能共存,得看启动方式——纯单元测试就别碰Spring上下文。










