因为工作需要,初步学了了下使用Mockito编写单元测试,现将学习笔记做个记录,加深下记忆。
做一个Facade层的单元测试,对FacilitatorSiteRelationConfigFacadeImpl 的insertFacilitatorSiteRelationConfig方法 编写测试用例代码。
方法代码如下:
最终测试代码如下:
根据个人喜好,此处命名为 FacilitatorSiteRelationConfigFacadeImplMockitoTest
增加注解用例运行的容器,(@RunWith(MockitoJUnitRunner.class)
mockito一个优势就是不依赖spring容器,所以运行时不需要加载spring容器依赖的jar和配置,所以效率会提升
因为没有用spring容器,所以autowire无法生效,@InjectMocks 创建一个实例,其他的@Mock注解会注入到该实例中
@InjectMocks
private FacilitatorSiteRelationConfigFacade facilitatorSiteRelationConfigFacade = new FacilitatorSiteRelationConfigFacadeImpl();
待测试方法内依赖两个service,创建两个service的Mock对象
@Mock
private OdsAreaService odsAreaService;
@Mock
private FacilitatorSiteRelationConfigService facilitatorSiteRelationConfigService;
@Test
public void insertFacilitatorSiteRelationConfigTest() {
}
测试逻辑实现
List list =null;
Mockito.when(facilitatorSiteRelationConfigService.listFacilitatorSiteRelationConfigByProperty(Mockito.any())).thenReturn(list);
Integer insertCount =1;
Mockito.when(facilitatorSiteRelationConfigService.insertFacilitatorSiteRelationConfig(Mockito.any())).thenReturn(insertCount);
Integer updateCount = 1;
Mockito.when(odsAreaService.updateArea(Mockito.any())).thenReturn(updateCount);
OdsArea odsArea = new OdsArea();
odsArea.setOdsAreaId(111);
Mockito.when(odsAreaService.queryOdsArea(Mockito.any())).thenReturn(odsArea);
resultModel = facilitatorSiteRelationConfigFacade.insertFacilitatorSiteRelationConfig(record);
因为是成功用例,所以对facilitatorSiteRelationConfigService、odsAreaService的依赖都定义返回成功时预期结果,
定义list 为facilitatorSiteRelationConfigService.listFacilitatorSiteRelationConfigByProperty() 的预期mock结果,
定义 insertCount 为 facilitatorSiteRelationConfigService.insertFacilitatorSiteRelationConfig()的预期mock结果,
定义 updateCount 为odsAreaService.updateArea() 的 预期mock结果,
定义 odsArea 为 odsAreaService.queryOdsArea() 的预期mock结果,
定义方法 Mockito.when(方法(方法参数)).thenReturn(结果).
执行
初步学习,使用还是比较简单。个人总结与junit的差别:
1、运行容器不同,junit依赖spring容器,mockito依赖自身容器 各有优点和缺点 junit启动时间长,因为依赖项较多,对应的启动时加载较多,但是会在启动时对项目做校验如方法有依赖配置或者其他规范性错误,容器会校验出来。mockito依赖少,启动时间端,mock掉的依赖如果有问题,在此处无法发现。
2、单元测试覆盖粒度差异,mock覆盖掉依赖,所以无法测试依赖项是否正常,如果有需求,需要再对依赖项编写mock测试用例。junit能够对整个方法的流程做测试,从代码到依赖数据库,脚本正确性做测试。
3、junit 依赖数据库数据,操作中如果不加事务,并进行事务回滚,会更改数据库数据,原来运行正常的用例如果数据库中数据被修改,则可能导致用例运行失败;mock测试不依赖数据库,不会操作到数据库数据。
4、junit对于功能测试比较全面,mock测试对于单元测试覆盖率的达标比较有优势。