如何Mock JDBC数据源对象?解决‘Property datasource is required’异常
解决Mock JdbcTemplate初始化时的DataSource异常问题
这个问题的核心是JdbcTemplate在实例化阶段会对传入的DataSource做基本有效性校验,哪怕是Mock对象,也需要满足它的最低要求,否则就会抛出"Property datasource is required"这类异常。你之前创建的DataSource Mock是空的,没有Stub任何必要的方法,导致JdbcTemplate初始化失败。下面给你两种可行的解决方案:
方案一:使用Spring提供的占位式DataSource(最简单)
Spring自带了SimpleDriverDataSource,它不需要实际的数据库驱动或连接信息,只是一个占位的DataSource实现,能直接通过JdbcTemplate的校验。你可以直接用它来替代Mock的DataSource:
// 在测试类中创建占位数据源 DataSource dataSource = new SimpleDriverDataSource(); // 配置你的datasourceResolver Mock返回这个数据源 Mockito.when(datasourceResolver.selectDataSource(Mockito.anyString())).thenReturn(dataSource);
这样JdbcTemplate初始化时不会触发任何连接校验,直接就能正常创建实例。
方案二:Mock DataSource并Stub必要方法
如果你必须用Mockito来Mock DataSource,需要Stub它的getConnection()方法(JdbcTemplate初始化时会尝试获取连接来做基本校验),避免抛出异常:
// Mock DataSource和Connection对象 DataSource dataSource = Mockito.mock(DataSource.class); Connection connection = Mockito.mock(Connection.class); // Stub getConnection方法,让JdbcTemplate能通过校验 Mockito.when(dataSource.getConnection()).thenReturn(connection); // 配置datasourceResolver返回这个Mock的DataSource Mockito.when(datasourceResolver.selectDataSource(Mockito.anyString())).thenReturn(dataSource);
如果你的测试中还涉及到JdbcTemplate执行SQL,可能还需要继续Stub Connection下的Statement、ResultSet等对象,但如果只是想让JdbcTemplate能正常实例化,上面的代码就足够了。
额外提示:Spring Boot测试的简化方式
如果你是在Spring Boot项目中做测试,可以用@MockBean注解来自动注入Mock对象,代码会更简洁:
@SpringBootTest class YourDaoTest { @MockBean private DataSourceResolver datasourceResolver; @MockBean private DataSource dataSource; @BeforeEach void setUp() { Connection connection = Mockito.mock(Connection.class); Mockito.when(dataSource.getConnection()).thenReturn(connection); Mockito.when(datasourceResolver.selectDataSource(Mockito.anyString())).thenReturn(dataSource); } // 测试方法... }
内容的提问来源于stack exchange,提问作者user2381029
相关产品推荐
相关产品推荐

