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

Java中如何为executeUpdateNativeQuery编写无数据库依赖的JUnit测试用例

测试方案实现

核心思路是用Mockito框架Mock掉数据库执行方法executeUpdateNativeQuery,只验证方法的参数组装、SQL拼接逻辑是否符合预期,完全不需要对接任何真实/内存数据库。

前置依赖

你需要在项目中引入Mockito测试依赖,以Maven为例:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>4.11.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>4.11.0</version>
    <scope>test</scope>
</dependency>

测试用例代码

假设待测试方法属于类ExtActionedRecordDao,测试代码如下:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.List;
import java.util.Map;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;

@ExtendWith(MockitoExtension.class)
public class ExtActionedRecordDaoTest {

    // 用Spy注解实现部分Mock:deleteExistingRecord走真实逻辑,仅拦截内部调用的数据库执行方法
    @Spy
    private ExtActionedRecordDao extActionedRecordDao;

    @Test
    public void testDeleteExistingRecord_withValidIds() throws Exception {
        // 构造测试入参
        List<String> testIds = List.of("test_id_01", "test_id_02", "test_id_03");
        // 执行待测试方法
        extActionedRecordDao.deleteExistingRecord(testIds);
        // 验证数据库执行方法被正确调用,传入的SQL、参数完全符合预期
        verify(extActionedRecordDao).executeUpdateNativeQuery(
                eq("DELETE FROM REG.EXT_ACTIONED_RECORD T WHERE EXT_SRC_ID in :extSourceIds"),
                eq(Map.of("extSourceIds", testIds))
        );
    }

    @Test
    public void testDeleteExistingRecord_withEmptyIds() throws Exception {
        // 空列表场景测试,可根据你的业务逻辑调整验证规则
        List<String> emptyIds = List.of();
        extActionedRecordDao.deleteExistingRecord(emptyIds);
        verify(extActionedRecordDao).executeUpdateNativeQuery(
                eq("DELETE FROM REG.EXT_ACTIONED_RECORD T WHERE EXT_SRC_ID in :extSourceIds"),
                eq(Map.of("extSourceIds", emptyIds))
        );
    }
}

补充说明

  • 这种测试属于纯单元测试,仅验证业务逻辑(参数封装、SQL拼接)的正确性,不会产生任何真实的数据库交互,执行速度极快
  • 如果executeUpdateNativeQuery是你注入的独立DAO工具类/持久化框架(如JdbcTemplate、EntityManager)的方法,把@Spy换成@Mock注入对应的工具类实例,再把待测试类实例化时传入这个Mock对象即可,验证逻辑完全一致

内容的提问来源于stack exchange,提问作者Siva Sai kiran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:36:03