@SpringBootTest无法启动测试:上下文加载后测试未执行
看起来你的测试上下文能正常加载,但测试方法跑不起来,我帮你梳理几个最可能的原因,你可以逐一排查:
1. 检查JUnit注解的导入是否正确
你用了@RunWith(SpringRunner.class),这是JUnit 4的运行器配置,对应的@Test注解必须导入org.junit.Test。如果不小心导入了JUnit 5的org.junit.jupiter.api.Test,JUnit 4的运行器会识别不到这个测试方法,自然不会执行。
打开你的测试类,确认@Test的导入包:
// 正确的导入(JUnit4) import org.junit.Test; // 错误的导入(JUnit5,会导致测试不执行) // import org.junit.jupiter.api.Test;
如果项目里同时引入了JUnit4和JUnit5的依赖,建议在spring-boot-starter-test里排除JUnit5相关依赖,避免版本冲突:
<!-- Maven依赖示例 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> </exclusion> <exclusion> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> </exclusion> </exclusions> </dependency>
2. 确认测试类与主启动类的包结构匹配
Spring Boot测试默认会扫描测试类所在包及其子包下的组件,如果你的测试类WebAppTest和Spring Boot主启动类不在同一个根包下(比如主启动类在com.example.demo,测试类在com.example.test),就需要在@SpringBootTest里明确指定主启动类:
@SpringBootTest(classes = YourMainApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
虽然你说上下文加载成功,但如果没扫到控制器,测试请求会返回404;如果是测试方法根本不执行,这个可能不是核心原因,但也可以排查下。
3. 检查IDE的测试运行配置
有时候IDE的配置会导致测试无法执行:
- 确认你的
WebAppTest被IDE标记为测试类(比如IDEA里,src/test/java目录是蓝色的测试目录) - 右键测试方法运行时,选择的运行器是不是JUnit 4,而不是JUnit 5
- 清理IDE缓存(比如IDEA里的
File -> Invalidate Caches / Restart),缓存问题偶尔会导致测试不执行
4. 验证MockMvc的自动配置是否生效
虽然你加了@AutoConfigureMockMvc,但如果依赖缺失或者配置冲突,MockMvc可能没被正确注入。你可以在测试方法里加一行打印,看看mvc是不是null:
@Test public void getTopJsonTest() throws Exception { System.out.println("MockMvc实例:" + mvc); // 检查是否为null mvc.perform( get("/api/v1/top") .contentType(MediaType.APPLICATION_JSON) ) .andExpect(status().isOk()) .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)); }
如果是null,说明自动配置没生效,大概率是依赖的问题,回到第一步检查spring-boot-starter-test依赖是否完整。
先从这几个方向排查,最常见的就是JUnit注解导入错误或者依赖版本冲突的问题,应该能解决你的测试无法执行的问题。
内容的提问来源于stack exchange,提问作者Вадим Парафенюк

