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

 

posted @ 2017-08-17 20:09  乌云de博客  阅读(2329)  评论(0编辑  收藏  举报