原!!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 这个有什么更好的用处么??待续。。。
最新文章
- node.js使用汇总贴
- javamail发送邮件的简单实例(转)
- HeadFirst设计模式 之 C++实现(二):Observer(观察者模式)
- 解决VM安装VMTools后错误提示,实现文件共享
- G - Zombie’s Treasure Chest(动态规划专项)
- iBatis一些非见用法(相当实用)
- rabbitMQ教程(三) spring整合rabbitMQ代码实例
- ubuntu14下mysql忘记密码的处理
- Python学习笔记 - 字符串和编码
- ubuntu16.04 安装vscode
- 理解sort()函数的排序原理
- 马凯军 周强 张季跃《面向对象与程序设计 Java》第十四周学习总结
- Centos7配置hadoop伪分布式
- numpy版本查看以及升降
- CEPH Object Gateway
- php redis在windows下的部署
- 单点登录SSO+鉴权
- [学习笔记]Link-Cut Tree
- Xianfeng轻量级Java中间件平台:一期开发计划
- 利用jquery.backstretch插件,背景切换
热门文章
- hsqldb
- iOS开发25个性能调优技巧
- Google Analytics Overview - Google Analytics 概述
- 获取JQuery UI tabs中被选中的tabs的方法
- nginx-1.14.0安装
- nginx健康节点检查nginx_upstream_check_module 淘宝的upstream_check进行nginx后端检查 tengine
- Prerender Application Level Middleware - ASP.NET Core Middleware
- js计算百分比
- jqgrid的search
- 正确的关机方法: sync, shutdown, reboot, halt, poweroff, init