如何使用JUnit测试基于JDBC的Job对象SQL UPDATE操作?
测试JDBC UPDATE操作的JUnit实现步骤
首先先修正你createJob方法里的两处bug,否则测试会报错:
- 未初始化
MapSqlParameterSource namedParameters,会触发空指针异常 - INSERT语句用到了
:employee参数,但代码里未添加该参数值
修正后的createJob代码:
public int createJob(Job job){ MapSqlParameterSource namedParameters = new MapSqlParameterSource(); String sql1="INSERT INTO jobs (employee, title, tool1, tool2) VALUES(:employee, :title, :tool1, :tool2)"; namedParameters.addValue("employee", job.getEmployee()); namedParameters.addValue("title", job.getTitle()); namedParameters.addValue("tool1", job.getTool1()); namedParameters.addValue("tool2", job.getTool2()); // 如果id是数据库自增主键,无需手动添加,数据库会自动生成 int rValue=jdbc.update(sql1, namedParameters); return rValue; }
1. 依赖准备
确保项目引入Spring Boot测试依赖(以Maven为例):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
2. 编写JUnit测试类
假设你的updateJob和createJob方法在JobDao类中,测试类实现如下:
import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.Rollback; import org.springframework.transaction.annotation.Transactional; import static org.junit.jupiter.api.Assertions.*; @SpringBootTest @Transactional // 开启事务,保证测试数据隔离 @Rollback(true) // 测试完成后自动回滚数据,不污染数据库 public class JobDaoTest { @Autowired private JobDao jobDao; @Test public void testUpdateJob() { // 1. 创建初始Job并插入数据库 Job originalJob = new Job(); originalJob.setEmployee("张三"); originalJob.setTitle("初始测试标题"); originalJob.setTool1("初始工具A"); originalJob.setTool2("初始工具B"); int insertCount = jobDao.createJob(originalJob); assertEquals(1, insertCount, "Job插入失败"); // 2. 构造更新后的Job对象(注意id要和插入的Job一致) // 若id是自增主键,需修改createJob方法获取生成的主键,示例见下文 Job updateJob = new Job(); updateJob.setId(originalJob.getId()); updateJob.setTitle("更新后的标题"); updateJob.setTool1("更新工具X"); updateJob.setTool2("更新工具Y"); // 3. 执行更新操作 int updateCount = jobDao.updateJob(updateJob); assertEquals(1, updateCount, "Job更新失败"); // 4. 查询数据库验证更新结果 Job retrievedJob = jobDao.getJobById(originalJob.getId()); // 假设存在该查询方法 assertEquals("更新后的标题", retrievedJob.getTitle()); assertEquals("更新工具X", retrievedJob.getTool1()); assertEquals("更新工具Y", retrievedJob.getTool2()); } }
3. 自增主键处理(关键)
如果你的jobs表id是自增主键,需要修改createJob方法获取数据库生成的主键值,否则更新时拿不到正确的id:
public int createJob(Job job){ String sql1="INSERT INTO jobs (employee, title, tool1, tool2) VALUES(:employee, :title, :tool1, :tool2)"; MapSqlParameterSource namedParameters = new MapSqlParameterSource(); namedParameters.addValue("employee", job.getEmployee()); namedParameters.addValue("title", job.getTitle()); namedParameters.addValue("tool1", job.getTool1()); namedParameters.addValue("tool2", job.getTool2()); KeyHolder keyHolder = new GeneratedKeyHolder(); int rValue = jdbc.update(connection -> { PreparedStatement ps = connection.prepareStatement(sql1, new String[]{"id"}); namedParameters.prepareStatement(ps); return ps; }, keyHolder); // 将生成的主键赋值给job对象 if(keyHolder.getKey() != null){ job.setId(keyHolder.getKey().intValue()); // 根据实际id类型调整,比如long } return rValue; }
核心注意事项
- 事务回滚:
@Transactional+@Rollback确保每次测试后数据被重置,避免测试数据残留影响后续用例 - 断言验证:通过断言验证插入、更新的影响行数是否为1(确认操作生效),再查询数据库对比字段值是否符合预期
- 查询方法:需要实现
getJobById这类查询方法,用于验证更新后的结果
内容的提问来源于stack exchange,提问作者rediska
相关产品推荐
相关产品推荐

