Java DAO类getAllUpcomingReservations方法测试逻辑实现求助
Java DAO 方法测试实现逻辑
这里提供两种常用的实现方案,你可以根据项目技术栈选择:
方案1:H2内存数据库单元测试(隔离性高,可验证SQL正确性)
适合需要验证SQL语句正确性的场景,不依赖外部测试数据库:
- 第一步:引入H2内存数据库、Spring Test相关依赖(Spring项目可直接用spring-boot-starter-test)
- 第二步:测试类配置H2数据源,启动测试时执行
reservation表的建表语句,提前插入测试数据:
插入2条park_id=1且from_date在当前日期到未来30天范围内的记录,额外插入至少1条不符合条件的记录(比如park_id=2、或日期超出30天范围的记录)用于验证过滤逻辑正确性 - 第三步:注入待测试的DAO实现类,编写测试方法:
@SpringBootTest public class ReservationDaoTest { @Autowired private ReservationDao reservationDao; @Test public void testGetAllUpcomingReservationsReturnsTwoPark1Records() { // 调用待测试方法 List<UpcomingReservation> result = reservationDao.getAllUpcomingReservations(); // 断言返回条数符合预期 assertEquals(2, result.size()); // 断言所有返回记录的parkId都是1 result.forEach(res -> assertEquals(1, res.getParkId())); } }
方案2:Mockito Mock依赖(执行速度快,不需要数据库环境)
适合不需要验证SQL,只测试DAO业务逻辑的场景:
- 第一步:引入Mockito依赖,测试类中Mock JdbcTemplate,注入待测试DAO
- 第二步:构造模拟的SqlRowSet对象,设置两条parkId=1的模拟返回数据
- 第三步:Mock
jdbcTemplate.queryForRowSet方法的返回值为构造好的SqlRowSet - 编写测试方法示例:
@ExtendWith(MockitoExtension.class) public class ReservationDaoTest { @Mock private JdbcTemplate jdbcTemplate; @InjectMocks private ReservationDao reservationDao; @Test public void testGetAllUpcomingReservationsReturnsTwoPark1Records() { // 构造模拟返回结果 SqlRowSet mockRowSet = mock(SqlRowSet.class); when(mockRowSet.next()).thenReturn(true, true, false); // 模拟第一条记录parkId=1 when(mockRowSet.getInt("park_id")).thenReturn(1); // 这里补充其他字段的模拟返回... // Mock jdbcTemplate调用返回 when(jdbcTemplate.queryForRowSet(anyString())).thenReturn(mockRowSet); // 调用方法断言 List<UpcomingReservation> result = reservationDao.getAllUpcomingReservations(); assertEquals(2, result.size()); assertEquals(1, result.get(0).getParkId()); } }
注意:你当前的DAO方法SQL没有加
park_id=1的过滤条件,如果需求要求该方法本身只返回parkId为1的记录,需要在原SQL的WHERE条件中补充AND park_id = 1。
内容的提问来源于stack exchange,提问作者user15764259
相关产品推荐
相关产品推荐

