如何为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数据库文件作为测试数据源,配置步骤如下:
- 把你准备好的H2数据库文件(后缀为
.mv.db)放到test/resources目录下,假设文件名为predefined.mv.db - 在
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
- 测试类中不要用
@MockBean修饰EntityXRepository,直接注入真实实现即可,启动测试时会自动加载预置数据库中的所有记录。
内容的提问来源于stack exchange,提问作者MADHAVI KUMARI
相关产品推荐
相关产品推荐

