You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 20:54:07