如果是非单元测试
mock 一个数据库连接不难,实际上只要 mock 一个 DataSource 对象,然后根据项目实际初始化方式放进去就可以了,而这个对象实际连接到本地的任意数据库即可。下面的例子使用 mybatis 和 H2 数据库:
DataSource dataSource = new org.apache.ibatis.datasource.pooled.PooledDataSource(
"org.h2.Driver","jdbc:h2:mem:",null,null
);
上面的例子创建的是一个空的数据库,所以如果启动过程中有数据库操作,肯定会失败。因此要么把这些操作从初始化过程中移走,要么在 mock 数据库中创建同样的表等等,让初始化过程顺利完成。
如果是单元测试
在 Spring Boot 的单元测试中,可以用 @MockBean 来隔离很多东西,比如项目中用了一个 Jedis 对象,但是某个单元测试并不需要连接 Redis 服务,那么可以:
@SpringBootTest
@RunWith(SpringRunner.class)
public class ATest {
@MockBean
private Jedis jedis; // 1
@Test
public void test1() {
...
}
}
// 1 这里就是告诉 Spring Boot 创建一个模拟的 Jedis 对象,它不会连接任何服务,这样就省去了下面的麻烦:1) 在本地运行一个真正的 Redis 服务;2)离线开发时修改项目配置指向本地的 Redis 服务,集成测试时又要改回去。