前两天写单元测试的时候,发现一个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 这个有什么更好的用处么??待续。。。

最新文章

  1. node.js使用汇总贴
  2. javamail发送邮件的简单实例(转)
  3. HeadFirst设计模式 之 C++实现(二):Observer(观察者模式)
  4. 解决VM安装VMTools后错误提示,实现文件共享
  5. G - Zombie’s Treasure Chest(动态规划专项)
  6. iBatis一些非见用法(相当实用)
  7. rabbitMQ教程(三) spring整合rabbitMQ代码实例
  8. ubuntu14下mysql忘记密码的处理
  9. Python学习笔记 - 字符串和编码
  10. ubuntu16.04 安装vscode
  11. 理解sort()函数的排序原理
  12. 马凯军 周强 张季跃《面向对象与程序设计 Java》第十四周学习总结
  13. Centos7配置hadoop伪分布式
  14. numpy版本查看以及升降
  15. CEPH Object Gateway
  16. php redis在windows下的部署
  17. 单点登录SSO+鉴权
  18. [学习笔记]Link-Cut Tree
  19. Xianfeng轻量级Java中间件平台:一期开发计划
  20. 利用jquery.backstretch插件,背景切换

热门文章

  1. hsqldb
  2. iOS开发25个性能调优技巧
  3. Google Analytics Overview - Google Analytics 概述
  4. 获取JQuery UI tabs中被选中的tabs的方法
  5. nginx-1.14.0安装
  6. nginx健康节点检查nginx_upstream_check_module 淘宝的upstream_check进行nginx后端检查 tengine
  7. Prerender Application Level Middleware - ASP.NET Core Middleware
  8. js计算百分比
  9. jqgrid的search
  10. 正确的关机方法: sync, shutdown, reboot, halt, poweroff, init