@ExtendWith(SpringExtension.class)失效:Spring Boot 2.x中JUnit 5测试Controller
排查Spring Boot 2.x中JUnit 5 @ExtendWith(SpringExtension.class)失效问题
嘿,我来帮你搞定这个@ExtendWith(SpringExtension.class)的问题!结合Spring Boot 2.x和JUnit 5的使用场景,我整理了几个最可能的原因和解决办法:
1. 核心问题:JUnit 4与JUnit 5注解混用
你当前代码里的import org.junit.Test;是JUnit 4的注解,而@ExtendWith是JUnit 5(Jupiter)的扩展注解,两者完全不兼容,这是最常见的失效原因。
解决办法:
把JUnit 4的@Test替换成JUnit 5的版本:
import org.junit.jupiter.api.Test; // 替换原来的org.junit.Test
2. 确认依赖配置正确性
Spring Boot 2.2.x及以上版本
这个版本的spring-boot-starter-test已经默认集成了JUnit 5依赖,并且自动排除了JUnit 4,不需要额外配置。如果你的pom.xml/gradle里手动添加了JUnit 4依赖,需要排除它:
- Maven示例:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>junit</groupId> <artifactId>junit</artifactId> </exclusion> </exclusions> </dependency>
- Gradle示例:
testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'junit', module: 'junit' }
Spring Boot 2.2.x以下版本
需要手动添加JUnit 5的核心依赖:
- Maven示例:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>junit</groupId> <artifactId>junit</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <scope>test</scope> </dependency>
3. 简化测试类注解(Spring Boot 2.2+)
在Spring Boot 2.2及以上版本,@SpringBootTest、@WebMvcTest等测试注解已经默认集成了@ExtendWith(SpringExtension.class),你完全不需要手动添加这个注解,直接使用场景化的测试注解即可。比如Controller测试推荐用轻量的@WebMvcTest:
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.web.servlet.MockMvc; @WebMvcTest(YourTargetController.class) // 替换为你的Controller类 public class ControllerTest { @Autowired private MockMvc mockMvc; @Test public void testEndpoint() throws Exception { mockMvc.perform(get("/your-api-path")) .andExpect(status().isOk()) .andExpect(content().string("expected-response-content")); } }
4. 检查IDE测试运行配置
部分IDE可能默认用JUnit 4运行器执行测试,需要手动切换:
- 比如在IntelliJ IDEA中,右键测试类选择「Run」,进入运行配置界面,确认「Test runner」选择的是「JUnit 5」。
内容的提问来源于stack exchange,提问作者Anand Rockzz
相关产品推荐
相关产品推荐

