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

如何使用Mockito为Java的PreparedStatement编写JUnit测试用例

单元测试实现方案

你遇到的Connection为null的问题,本质是单元测试时没有向createPreparedStatement方法传入有效的Connection实例,该方法是Spring JdbcTemplate执行时自动传入数据库连接的,单元测试无需连接真实数据库,用Mockito模拟相关依赖对象即可完成测试。

1. 依赖引入

首先确保pom.xml(Maven项目)中引入JUnit和Mockito依赖:

<!-- JUnit 5 依赖 -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.9.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.9.2</version>
    <scope>test</scope>
</dependency>
<!-- Mockito 依赖 -->
<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>

2. 完整测试类代码

import java.sql.Clob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import com.example.beans.SaveLegacy;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

public class InsertAgentTest {

    @Test
    public void testCreatePreparedStatement() throws Exception {
        // 1. 模拟JDBC相关依赖对象
        Connection mockConn = Mockito.mock(Connection.class);
        Clob mockClob = Mockito.mock(Clob.class);
        PreparedStatement mockPstmt = Mockito.mock(PreparedStatement.class);

        // 2. 定义模拟对象的行为
        when(mockConn.createClob()).thenReturn(mockClob);
        when(mockConn.prepareStatement(anyString())).thenReturn(mockPstmt);

        // 3. 构造测试入参
        SaveLegacy testLegacy = new SaveLegacy();
        // base64编码后的测试内容:测试文本
        String testBase64Content = "5rWL6K+V5paH5pys";
        testLegacy.setAssociatedData(testBase64Content);
        testLegacy.setACode("TEST_CODE");
        testLegacy.setGuid("test-guid-123");
        testLegacy.setModifiedByUserId("user001");
        String testQuery = "INSERT INTO legacy_table(a_code,guid,system_code,content,raw_data,modify_user) VALUES(?,?,?,?,?,?)";
        String testSystemCode = "SYS_001";
        Integer testDocumentId = 1001;

        // 4. 实例化被测类
        InsertAgent insertAgent = new InsertAgent(testQuery, testLegacy, testSystemCode, testDocumentId);

        // 5. 执行被测方法
        PreparedStatement result = insertAgent.createPreparedStatement(mockConn);

        // 6. 验证逻辑正确性
        // 验证Connection方法调用
        verify(mockConn).createClob();
        verify(mockConn).prepareStatement(testQuery);
        // 验证Clob赋值
        verify(mockClob).setString(1, "测试文本");
        // 验证PreparedStatement参数赋值
        verify(mockPstmt).setString(1, "TEST_CODE");
        verify(mockPstmt).setString(2, "test-guid-123");
        verify(mockPstmt).setString(3, "SYS_001");
        verify(mockPstmt).setClob(4, mockClob);
        verify(mockPstmt).setString(5, testBase64Content);
        verify(mockPstmt).setString(6, "user001");
    }
}

3. 测试逻辑说明

  • 所有JDBC相关的Connection、Clob、PreparedStatement都用Mockito创建模拟实例,不需要启动真实数据库
  • 通过when方法定义模拟对象的返回值,还原真实执行时的对象流转逻辑
  • 最终通过verify方法校验各个参数的赋值是否符合预期,保证业务逻辑正确

内容的提问来源于stack exchange,提问作者Masoom Raza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:18:00