使用mockito模拟被测试类的成员时特殊问题

刚实习的前几个月做了一段时间的单元测试,那时候也算是刚接触单元测试,也碰到很多问题解决了但是没有记录下来,之后又转开发功能去了,现在又需要写单元测试好多技巧都忘了,同时也碰到一些新的问题解决了,所以现在准备记录下来:
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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值