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

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

1. pom引入junit,springboot中引用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,事务

 

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

 

相关推荐