单元测试使用的Mockito,详细使用可参考:
项目引入mock
1. 添加依赖
<dependency>
<groupId>org.mockito</groupId>
<artifactId>m</artifactId>
<scope>test<scope>
</dependency>
2. 在需要添加测试用例的类上执行Ctrl+Shift+t,可以生成测试类,选择全部方法
3. 在测试类引入Mockito方法: import static org.mockito.Mockito.*;
4. 类注解添加@RunWith(MockitoJUnitRunner.class)
5. 在生成的测试类上编写测试用例
案例
1. 调用第三方接口
when(xxxApi.XXX(any())).thenReturn("xxx")
2. 数据库交互
when(xxxDao.XXX(any())).thenReturn("xxx")
3. 数据库保存更新操作
doNothing().when(deptService).save(Mockito.any());
4. 数据库查询,使用父类convert
when(XXXX.convert(Mockito.any(), Mockito.any())).thenReturn(xxx);
5. 数据库查询是mock项目中的接口dao
when(xxxDao.findAll(Mockito.any(XXX.class), Mockito.any(XXX.class))).thenReturn("xxx")
6. 单元测试中EntityManager查询数据库
//在实现类中,会使用EntityManager的方法createNativeQuery()来对sql进行查询操作。
String executeSql = BASIC_SQL_PARAMS + sql;
Query nativeQuery = entityManager.createNativeQuery(executeSql);
NativeQueryImplementor<Map<String, Object>> nativeQueryImplementor = nativeQuery
.unwrap(NativeQueryImpl.class)
.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List<Map<String, Object>> resultList = nativeQueryImplementor.getResultList();
//方法的入参是String类型的查询语句sql,返回值是接口Query ,所以需要mock一个Query的实现类,这里使用NativeQueryImpl 测试类中写法如下:
NativeQueryImpl<Map<String,Object>> queryMock = Mockito.mock(NativeQueryImpl.class);
when(entityManager.createNativeQuery(startsWith("select m"))).thenReturn(queryMock);
when(queryMock.unwrap(NativeQueryImpl.class)).thenReturn(queryMock);
when(queryMock.setResultTransformer(any())).thenReturn(queryMock);
when(queryMock.getResultList()).thenReturn(list);
常用语法介绍
1.when(userApi.trans("test1")).thenReturn("test1Suc");
解释:模拟uerApi.trans方法,入参为test1,返回参数为test1Suc。
2.when(deptDao.findById(Mockito.any())).thenReturn(Optional.of(d));
解释:模拟deptDao.findById入参为任意值,出参为d,d为返回对象。
当mock接口的时候Mockito.any()不可用,因为不能确定有多少实现。
3.doNothing().when(deptService).save(Mockito.any());
解释:当测试用例用碰到deptService.save方式时,不做任何处理。