JUnit 5中java.lang.NoClassDefFoundError: org/junit/rules/TestRule问题解决
解决JUnit 5中
java.lang.NoClassDefFoundError: org/junit/rules/TestRule错误 问题根源
你当前使用的JUnitRestDocumentation是Spring REST Docs针对JUnit 4设计的规则类,它依赖JUnit 4的org.junit.rules.TestRule接口,但JUnit 5已移除该接口,导致类加载失败。
解决方案
1. 更新依赖
替换为Spring REST Docs适配JUnit 5的依赖:
- Maven依赖:
<dependency> <groupId>org.springframework.restdocs</groupId> <artifactId>spring-restdocs-junit5</artifactId> <version>你的版本号</version> <scope>test</scope> </dependency>
- Gradle依赖:
testImplementation 'org.springframework.restdocs:spring-restdocs-junit5:你的版本号'
2. 修改测试基类
移除JUnitRestDocumentation字段,改用JUnit 5扩展类:
import org.springframework.restdocs.RestDocumentationExtension; import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; import org.junit.jupiter.api.extension.ExtendWith; @ExtendWith(RestDocumentationExtension.class) @SpringJUnitWebConfig public class BaseControllerTest { static { System.setProperty("org.jboss.logging.provider", "slf4j"); } // 移除原有的JUnitRestDocumentation字段 }
3. 调整测试类MockMvc配置
在具体测试类中通过RestDocumentationContext配置MockMvc:
import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; public class StandaloneControllerGetByIdTest extends BaseControllerTest { private MockMvc mockMvc; @Autowired public void setUp(WebApplicationContext webApplicationContext) { this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext) .apply(MockMvcRestDocumentation.documentationConfiguration()) .build(); } @Test public void lookupStandaloneReturnsIsSuccessful() throws Exception { mockMvc.perform( RestDocumentationRequestBuilders.get("/accounts", "123", "04d71b9379ef4db49c28e113485ea76d") .contentType("application/json")) .andExpect(status().isOk()); } }
关键说明
@ExtendWith(RestDocumentationExtension.class):让JUnit 5加载Spring REST Docs扩展,替代JUnit 4的规则机制。MockMvcRestDocumentation.documentationConfiguration():配置MockMvc以支持REST Docs,替代原JUnitRestDocumentation规则。RestDocumentationRequestBuilders:替换Spring MVC的MockMvcRequestBuilders,用于生成文档的请求构建。
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

