zoukankan      html  css  js  c++  java
  • 原!!junit mockito 自定义参数匹配 -- ArgumentMatcher

    前两天写单元测试的时候,发现一个dao对象 mock成功了,但是调用该dao对象的某个方法时,并没有按照设定的值返回,而是返回null。

    但是记得之前也都是这么写没有碰到问题,直接mock对象,调用方法,按照设定返回。

    问题具体描述如下:

    service方法及test方法如下:

    //某service的方法
    public
    void updateConfId(String confId, String businessId) { CdrCommonInfo cdrCommonInfo = new CdrCommonInfo(); cdrCommonInfo.setConfId(confId); cdrCommonInfo.setBusinessId(businessId); iSmsSendDao.updateCdrVoiceConfId(cdrCommonInfo); } //dao层的方法
    public interface ISmsSendDao {
        int updateCdrVoiceConfId(CdrCommonInfo cdrCommonInfo);//
    CdrCommonInfo 为自己定义的对象
    }
    //上述service的
    updateConfId 方法的测试方法如下,用下面这种方法写的test,不会按照预定的返回1

    @Test
    public void updateConfIdTest() {
      CdrCommonInfo cdrCommonInfo = new CdrCommonInfo();
      cdrCommonInfo.setConfId("0");
      cdrCommonInfo.setBusinessId("0");
      Mockito.doReturn(1).when(ISmsSendDaoMock ).updateCdrVoiceConfId(cdrCommonInfo);//ISmsSendDaoMock 为 mock的ISmsSendDao 对象

      voiceServiceImp.updateConfId("0", "0");
    }


    //改过之后 用argThat(new isCdrCommonInfo()),可以按照预定返回1 @Test
    public void updateConfIdTest() { Mockito.doReturn(1).when(spyISmsSendDao) .updateCdrVoiceConfId(argThat(new isCdrCommonInfo())); voiceServiceImp.updateConfId("0", "0"); }

    其中对象 isCdrCommonInfo 定义如下:

    public class isCdrCommonInfo extends ArgumentMatcher<CdrCommonInfo> {
      public boolean matches(Object cdrCommonInfo){
        if(cdrCommonInfo instanceof CdrCommonInfo)
          return true;
        else
          return false;
    }
    }



    原因 个人认为如下:

    updateConfIdTest()方法中 Mockito.doReturn(1).when(ISmsSendDaoMock ).updateCdrVoiceConfId(cdrCommonInfo) 创建的cdrCommonInfo对象,不等价于service 中updateConfId()方法中new出来的cdrCommonInfo对象或者说mockito 不认为这两个是相同的参数

    因此ISmsSendDaoMock 不能返回预设的参数值。

    参考博文1:http://blog.sina.com.cn/s/blog_6176c38201014jrk.html

    参考博文2:http://blog.csdn.net/zhangxin09/article/details/42422643

    写博客的时候,试着试着,发现原来这样子也可以!

    @Test
    public void updateConfIdTest() {

    //这样写也可以,就不用定义isCdrCommonInfo对象
      Mockito.doReturn(1).when(spyISmsSendDao)
    .  updateCdrVoiceConfId((CdrCommonInfo) Mockito.any());  

            //  或者 (CdrCommonInfo) Mockito.anyObject()       

      voiceServiceImp.updateConfId("0", "0");

    }

    那么问题来了。。。ArgumentMatcher 这个有什么更好的用处么??待续。。。

  • 相关阅读:
    “图”以致用组
    水体频率小组
    2021年云开发组三等奖作品展示
    毫秒级百万数据分页存储过程[欢迎转载]
    SQL Server 数据备份存储过程[原创]
    博客园居然被中国电信提醒有病毒,有图为证
    网络文件夹例子
    小技巧:在DropDownList数据绑定前插入固定文字
    ASP.NET整合Discuz!NT3.5实例说明(含用户登录、评论等)
    Visual Studio 2008的性能改进以及十大新功能(转)
  • 原文地址:https://www.cnblogs.com/wuyun-blog/p/7384148.html
Copyright © 2011-2022 走看看