欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Springboot整合(4)——JUnit,事务

程序员文章站 2022-03-01 20:34:21
...

Springboot整合(4)——JUnit,事务

1. pom引入junitspringboot中引用junit就是直接依赖spring-boot-starter-test

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-test</artifactId>

            <scope>test</scope>

        </dependency>

2. 通常测试放在service层做,所以首先编写service层代码,为统一整个项目编码风格,先创建2个辅助类,ReturnResult封装所有service层返回数据结果,Constants系统常量

publicclass ReturnResult {

    private static final long serialVersionUID = 1L;

    /**

     * 返回码,1表示成功,0表示失败

     */

    privateintcode;

    /**

     * 返回消息,可以是错误信息,也可以是其他提示信息

     */

    private String message;

    /**

     * 实际的数据返回

     */

    private HashMap<String, Object> data = new HashMap<String, Object>();

         ...getter and setter...

}

 

publicclass Constants {

 

    /**

     * 表示数据状态为正常

     */

    publicstaticfinalbyteSTATUS_NORMAL = 1;

    /**

     * 表示数据状态为已删除或作废

     */

    publicstaticfinalbyteSTATUS_DELETED = 2;

    /**

     * 默认密码:$888888

     */

    publicstaticfinal String DEFAULT_PASSWORD = "$888888";

 

}

 

UserService.java

@Service

publicclass UserService {

    @Resource

    private SysUserMapper userMapper;

 

    public ReturnResult add(SysUser user) {

        ReturnResult rs = new ReturnResult();

 

        SysUser exist = getByLoginName(user.getLoginName());

        if (exist != null) {

            rs.setCode(0);

            rs.setMessage("登录账号已存在");

            returnrs;

        }

 

        user.preInsert();

        user.setLoginPassword("admin");

        userMapper.insert(user);

 

        rs = new ReturnResult(1, "添加成功");

        rs.putData("entity", user);

        returnrs;

    }

 

    public ReturnResult update(SysUser user) {

        ReturnResult rs = new ReturnResult();

 

        SysUser exist = getByLoginName(user.getLoginName());

        if (exist != null) {

            rs.setCode(0);

            rs.setMessage("登录账号已存在");

            returnrs;

        }

 

        user.preUpdate();

        inteffectRow = userMapper.updateByPrimaryKeySelective(user);

 

        rs = new ReturnResult(1, "更新成功");

        rs.putData("effectRow", effectRow);

        returnrs;

    }

 

    public ReturnResult delete(String id) {

        inteffectRow = userMapper.deleteByPrimaryKey(id);

        ReturnResult rs = new ReturnResult(1, "删除成功");

        rs.putData("effectRow", effectRow);

        returnrs;

    }

 

    public ReturnResult get(String id) {

        SysUser entity = userMapper.selectByPrimaryKey(id);

        ReturnResult rs = new ReturnResult(1, "查询成功");

        rs.putData("entity", entity);

        returnrs;

    }

 

    public ReturnResult list() {

        SysUserExample example = new SysUserExample();

        Criteria c = example.createCriteria();

        c.andDataStatusEqualTo(Constants.STATUS_NORMAL);

        example.setOrderByClause(" updateTime desc");

        List<SysUser> list = userMapper.selectByExample(example);

 

        ReturnResult rs = new ReturnResult(1, "查询成功");

        rs.putData("list", list);

        returnrs;

    }

 

    public SysUser getByLoginName(String loginName) {

        SysUserExample example = new SysUserExample();

        Criteria c = example.createCriteria();

        c.andDataStatusEqualTo(Constants.STATUS_NORMAL);

        c.andLoginNameEqualTo(loginName);

        List<SysUser> list = userMapper.selectByExample(example);

        if (list.size() > 0) {

            returnlist.get(0);

        } else {

            returnnull;

        }

    }

}

 

3. 编写测试类,springboot使用junit非常简单,只要给类写以下2个红色注解就可以

@RunWith(SpringJUnit4ClassRunner.class)

@SpringBootTest

publicclass UserServiceTest {

 

    @Resource

    UserService userService;

 

    @Test

    publicvoid testAdd() {

        SysUser user = new SysUser();

        user.setLoginName("test1");

        user.setLoginPassword("test1");

        user.setUserName("第一个user");

        userService.add(user);

        Assert.assertEquals(1, rs.getCode());

    }

}

 

4. 运行测试类,显示绿色正常,检查数据库,数据已经插入

 

 
Springboot整合(4)——JUnit,事务
            
    
    博客分类: 框架整合

5. 配置数据自动回滚。

再次运行测试类,测试不通过,因为用户已存在,这显然不利于自动化重复测试。没关系,springtest提供了数据回滚功能,只需要在测试方法上添加一个@Transactional 即可

Springboot整合(4)——JUnit,事务
            
    
    博客分类: 框架整合

 

删除刚才插入的数据,再次运行测试用例,junit测试结果为绿色,但数据不会被插入。

如果你就是想让测试数据对数据库生效,可以添加@Rollback(false)

 Springboot整合(4)——JUnit,事务
            
    
    博客分类: 框架整合

6. service层开启事务管理。一个@Transactional注解搞定

Springboot整合(4)——JUnit,事务
            
    
    博客分类: 框架整合
注: service层开启事务后,即使测试方法添加了@Rollback(false) ,如果service方法报错,事务也不会提交,数据库同样会回滚,不用担心这个rollback会对service层的事务造成影响

Springboot整合(4)——JUnit,事务
            
    
    博客分类: 框架整合

 

 

运行测试类,数据库不会被插入数据

 

  • Springboot整合(4)——JUnit,事务
            
    
    博客分类: 框架整合
  • 大小: 9.8 KB
  • Springboot整合(4)——JUnit,事务
            
    
    博客分类: 框架整合
  • 大小: 10 KB
  • Springboot整合(4)——JUnit,事务
            
    
    博客分类: 框架整合
  • 大小: 10.3 KB
  • Springboot整合(4)——JUnit,事务
            
    
    博客分类: 框架整合
  • 大小: 4.4 KB
  • Springboot整合(4)——JUnit,事务
            
    
    博客分类: 框架整合
  • 大小: 15.7 KB