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

如何为Mockito提供预置数据的嵌入式数据库用于Spring Boot单元测试

核心认知澄清

首先需要明确:Mockito本身是模拟对象框架,仅负责生成虚拟的类实例,本身不提供、也不管理嵌入式数据库。你遇到的空库情况属于以下两种常见场景:

  • 测试中使用@MockBean注入了模拟的EntityXRepository实例,此时所有Repository方法调用默认返回空值,完全没有走实际数据库
  • 测试使用@DataJpaTest等Spring Boot测试注解启动了内存嵌入式数据库(默认是H2),但没有做数据初始化配置

方案1:直接模拟Repository返回结果(普通单元测试推荐)

如果仅测试MyService的业务逻辑,不需要真实操作数据库,直接用Mockito定义Repository方法的返回行为即可,不需要额外配置数据库:

@SpringBootTest
public class MyServiceTest {
    @Autowired
    MyService myService;
    // 用MockBean替换Spring容器中的真实Repository实现
    @MockBean
    EntityXRepository entityXRepository;

    @Test
    public void testProcess() {
        // 构造预置的EntityX对象
        EntityX mockEntity = new EntityX();
        mockEntity.setId(1L);
        // 按需赋值其他属性

        // 定义Mockito的返回规则:调用findById传入1L时,返回上面构造的实例
        Mockito.when(entityXRepository.findById(1L))
                .thenReturn(Optional.of(mockEntity));
        
        // 调用测试方法不会抛出找不到实体的异常
        Object result = myService.process(1L);
        // 后续添加业务结果断言即可
    }
}

方案2:加载带预置数据的嵌入式数据库

如果需要走真实的持久层逻辑,你可以直接指定预置的H2数据库文件作为测试数据源,配置步骤如下:

  1. 把你准备好的H2数据库文件(后缀为.mv.db)放到test/resources目录下,假设文件名为predefined.mv.db
  2. 在test/resources/application.properties中添加数据源配置:
spring.datasource.driver-class-name=org.h2.Driver
# 配置jdbc地址时不需要加.mv.db后缀
spring.datasource.url=jdbc:h2:classpath:predefined
spring.datasource.username=sa
spring.datasource.password=
# 禁用自动脚本初始化,避免覆盖预置数据
spring.sql.init.mode=never
  1. 测试类中不要用@MockBean修饰EntityXRepository,直接注入真实实现即可,启动测试时会自动加载预置数据库中的所有记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:09:02