刚实习的前几个月做了一段时间的单元测试,那时候也算是刚接触单元测试,也碰到很多问题解决了但是没有记录下来,之后又转开发功能去了,现在又需要写单元测试好多技巧都忘了,同时也碰到一些新的问题解决了,所以现在准备记录下来:
1.模拟的参数为null:Mockito.isNull()
2.模拟参数为任意类的对象:Mockito.any(TjAgency.class);此时方法报警告:添加注释:@SuppressWarnings(“unchecked”)
3.对于使用到私有方法的被测方法的测试:用到私有方法的地方必须让被测方法自动跑到私有方法,考虑全面被测方法可能的各种情况,当私有方法还存在没有测到的分支,这时才需要单独测试私有方法。私有方法的测试利用反射机制,举个栗子:
/**
* 得到相同父节点下的同名且处于删除状态的处室
* @param tjAgency
* @return
*/
private List<TjAgency> findDeleteedInSameparent(TjAgency tjAgency){
List<Condition> conditions = new ArrayList<Condition>();
if (StringUtils.isNotEmpty(tjAgency.getAgencyCaption())){
conditions.add(ConditionUtils.
getCondition("agencyCaption",Condition.EQUALS,tjAgency.getAgencyCaption()));
}else{
throw new BusException("处室名称不能为空!");
}
if (StringUtils.isNotEmpty(tjAgency.getParentCode())){
conditions.add(ConditionUtils.getCondition("parentCode",Condition.EQUALS,tjAgency.getParentCode()));
}else {
conditions.add(ConditionUtils.getCondition("parentCode",Condition.IS_NULL,tjAgency.getParentCode()));
}
conditions.add(ConditionUtils.getCondition("deleteStatus",Condition.EQUALS,Constants.AGENCY_DELETE));
return tjAgencyDao.commonQuery(conditions,null);
}
上面是被测私有方法,下面是单元测试方法
@Test
@SuppressWarnings("unchecked")
public void testFindDeleteedInSameparentNoData(){
ReflectionUtils.doWithMethods(tjAgencyManager.getClass(), new ReflectionUtils.MethodCallback() {
@Override
public void doWith(Method method) throws IllegalArgumentException, IllegalAccessException {
if (method.getName().equals("findDeleteedInSameparent")) {
method.setAccessible(true);
when(tjAgencyDao.commonQuery(Mockito.any(), Mockito.isNull()))
.thenReturn(new ArrayList<>());
List<TjAgency> tjAgencies=(List<TjAgency>) ReflectionUtils.
invokeMethod(method, tjAgencyManager, tjAgency);
assertThat(tjAgencies.size(), equalTo(0));
}
}
});
}
4.在程序中可以import org.mockito.Mockito,然后调用它的static方法:
import static org.mockito.Mockito.*;
使用hamcrest的断言:
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.IsEqual.equalTo;
5.测试的预期是抛出异常直接在注解上加:@Test(expected=BusException.class)