在完成了数据访问层的单元之后,接下来看如何编写服务层(Service)的单元测试。服务层应该是整个系统中得重中之重,严密的业务逻辑设计保证了系统稳定运行,所以这一层的单元测试也应该占很大比重。虽然一般情况下单元测试应该尽量通过mock剥离依赖,但是由于在当前的项目中数据访问层使用spring-data框架,并没有包含太多的逻辑,因此我就把服务层和数据访问层放在做了一个伪单元测试。
一、一般逻辑的单元测试。
这里采用的方式和数据访问层几乎是一样的,主要包含三步:
1. 通过@DatabaseSetup指定测试用数据集
2. 执行被测试方法
3. 通过Dao从数据库中查询数据验证执行结果
假设要被测试的代码方法是:
@Service @Transactional(readOnly = true) public class ShopServiceImpl extends BaseService implements ShopService{ private Logger logger = LoggerFactory.getLogger(ShopServiceImpl.class); @Transactional(readOnly = false) public Floor addFloor(String buildingName, int floorNum, String layout) { //如果已经存在对应的楼层信息,则抛出已经存在的异常信息 Floor floor = floorDao.findByBuildingNameAndFloorNum(buildingName, floorNum); if (floor != null) { throw new OnlineShopException(ExceptionCode.Shop_Floor_Existed); } //如果不存在对应的商场信息,则添加新的商场 Building building = buildingDao.findByName(buildingName); if (building == null) { building = new Building(); building.setName(buildingName); buildingDao.save(building); } //添加并返回楼层信息 floor = new Floor(); floor.setBuilding(building); floor.setFloorNum(floorNum); floor.setMap(layout); floorDao.save(floor); return floor; } } |
其对应的接口是:
public interface ShopService {
public Floor addFloor(String buildingName, int floorNum, String layout);
}