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

Spring Boot RESTful接口CRUD测试异常:预期空数组实际返回有效数据

问题排查与解决方案

可能的原因及排查步骤

1. 测试数据未隔离导致残留

测试执行过程中,之前的测试数据没有被清理,会干扰当前测试结果。

  • 给测试类添加事务回滚注解,确保测试结束后自动清空数据:
@SpringBootTest
@Transactional
@Rollback
public class CloudProductControllerTest {
    // 测试代码
}
  • 在测试方法执行前手动清空仓库:
@Autowired
private CloudProductRepository productRepo;

@BeforeEach
void setUp() {
    productRepo.deleteAll();
}

2. 自动数据初始化脚本干扰

项目中如果存在data.sql/data-dev.sql这类初始化脚本,或者CommandLineRunner/ApplicationRunner实现类,启动测试时会自动插入数据。

  • 在测试环境配置文件application-test.properties中禁用自动初始化:
spring.sql.init.mode=never
  • 排查启动类或配置类中的数据初始化代码,确保测试场景下不执行。

3. 未正确Mock依赖层

如果测试时直接调用真实的服务/仓库,而非Mock对象,会读取到数据库中已有的数据。

  • 测试控制器时,Mock服务层返回空列表:
@MockBean
private CloudProductService productService;

@Test
void testGetAllProducts() throws Exception {
    when(productService.getAllProducts()).thenReturn(Collections.emptyList());
    
    mockMvc.perform(get("/api/products"))
           .andExpect(status().isOk())
           .andExpect(content().json("[]"));
}

4. 事务配置异常

仓库自定义删除方法未添加事务注解,或者事务传播行为设置错误,导致数据无法回滚。

  • 检查自定义仓库方法是否添加@Transactional注解:
@Repository
public interface CloudProductRepository extends JpaRepository<CloudProduct, Long> {
    @Transactional
    void deleteAllByCategory(String category);
}

代码检查要点

  • 确认CloudProduct实体类的主键生成策略,避免重复数据插入。
  • 检查CloudProductService的getAllProducts()方法,确保没有额外添加数据的逻辑。
  • 验证@SpringBootTest是否指定了测试专属配置,避免加载生产环境的数据源和初始化逻辑。

内容的提问来源于stack exchange,提问作者Dadinho2000

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 14:40:24