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 这个有什么更好的用处么??待续。。。

  • 相关阅读:
    atitit...触发器机制 ltrigger mechanism sumup .的总结O8f
    atitit. 集合groupby 的实现(2)---自定义linq查询--java .net php
    atitit. groupby linq的实现(1)-----linq框架选型 java .net php
    atitit.j2ee 1.5 1.6 的不同跟 Servlet 3.0新特性总结
    Atitit. 常用街机系统and 模拟器总结 snk neo geo cps mame sfc smc
    atitit. access token是什么??微信平台公众号开发access_token and Web session保持状态机制
    atitit.二进制数据无损转字符串网络传输
    atitit.压缩算法 ZLib ,gzip ,zip 最佳实践 java .net php
    Atitit.现实生活中最好使用的排序方法-----ati排序法总结
    atitit.修复xp 操作系统--重装系统--保留原来文件不丢失
  • 原文地址:https://www.cnblogs.com/wuyun-blog/p/7384148.html
Copyright © 2011-2022 走看看