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. 运行测试类,显示绿色正常,检查数据库,数据已经插入
5. 配置数据自动回滚。
再次运行测试类,测试不通过,因为用户已存在,这显然不利于自动化重复测试。没关系,springtest提供了数据回滚功能,只需要在测试方法上添加一个@Transactional 即可
删除刚才插入的数据,再次运行测试用例,junit测试结果为绿色,但数据不会被插入。
如果你就是想让测试数据对数据库生效,可以添加@Rollback(false)
6. 在service层开启事务管理。一个@Transactional注解搞定
注: 在service层开启事务后,即使测试方法添加了@Rollback(false) ,如果service方法报错,事务也不会提交,数据库同样会回滚,不用担心这个rollback会对service层的事务造成影响
运行测试类,数据库不会被插入数据