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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:45:32