如何使用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
相关产品推荐
相关产品推荐

