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

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的模拟返回数据
  • 第三步:MockjdbcTemplate.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:48:01