如何为@RepositoryRestResource标注的Spring仓库创建合约测试
测试类核心注解组合
你可以通过以下注解组合启动最小化上下文,仅加载Spring Data REST web层、安全过滤链和MockMvc,不需要启动完整服务或数据库:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK):启动轻量级Mock上下文,不启动内嵌Web服务器,仅加载Web相关核心组件@AutoConfigureMockMvc(addFilters = true):自动配置MockMvc实例,自动加载Spring Security过滤链,保证权限注解生效@Import(RepositoryRestMvcConfiguration.class):导入Spring Data REST的核心配置,自动识别你标注了@RepositoryRestResource的仓库并生成对应接口@Import(你的Security配置类.class):导入你项目中的Spring Security配置类,如果你没有自定义配置可以替换为SecurityAutoConfiguration.class- 如果你用的是Spring Security 6+版本,还需要添加
@EnableMethodSecurity(prePostEnabled = true)确保方法级@PreAuthorize注解生效;旧版本Spring Security对应添加@EnableGlobalMethodSecurity(prePostEnabled = true)
另外需要引入spring-security-test测试依赖,使用其中的@WithMockUser注解可以快速模拟不同权限的测试用户。
你还需要在测试类中添加@MockBean注解修饰你的JPARepository,直接Mock掉仓库层避免需要连接数据库:
@MockBean private JPARepository jpaRepository;
完整测试类示例
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) @AutoConfigureMockMvc(addFilters = true) @Import({RepositoryRestMvcConfiguration.class, SecurityConfiguration.class}) @EnableMethodSecurity(prePostEnabled = true) class RepositoryPreAuthorizeTest { @Autowired private MockMvc mockMvc; @MockBean private JPARepository jpaRepository; @Test @WithMockUser(authorities = "OTHER_ROLE") void 无OWNER权限时返回403() throws Exception { mockMvc.perform(get("/x/search/findFirstBySpecificField") .param("specificField", "testValue")) .andExpect(status().isForbidden()); } @Test @WithMockUser(authorities = "OWNER") void 有OWNER权限时返回200() throws Exception { // mock仓库返回值,不需要真实数据库 when(jpaRepository.findFirstBySpecificField("testValue")).thenReturn(Optional.of(new X())); mockMvc.perform(get("/x/search/findFirstBySpecificField") .param("specificField", "testValue")) .andExpect(status().isOk()); } }
注意:路径中的
/x是你的实体类X对应的REST路径默认值,如果你自定义了路径请替换为实际值。
内容的提问来源于stack exchange,提问作者Manoel Stilpen
相关产品推荐
相关产品推荐

