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

原!!junit mockito 自定义参数匹配 -- ArgumentMatcher的更多相关文章

  1. JUnit + Mockito 单元测试

    原 JUnit + Mockito 单元测试(二) 2015年01月05日 17:26:02 sp42a 阅读数:60755 版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...

  2. JUnit + Mockito 单元测试(二)

    摘自: http://blog.csdn.net/zhangxin09/article/details/42422643 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 入门 ...

  3. JUnit + Mockito 单元测试(二)(good)

    import org.junit.Test; import org.mockito.Matchers; import org.mockito.Mockito; import java.util.Lis ...

  4. Mockito自定义verify参数Matcher

    在TDD开发中,也许我们会遇见对一些重要的无返回值的行为测试,比如在用户的积分DB中增加用户的积分,这个行为对于我们的业务具有重要的价值,所以我们也希望能测试覆盖这部分业务价值.这个时候我们就得使用m ...

  5. Junit mockito解耦合测试

    Mock测试是单元测试的重要方法之一. 1.相关网址 官网:http://mockito.org/ 项目源码:https://github.com/mockito/mockito api:http:/ ...

  6. Mockito 2 参数匹配器

    Mockito 通过使用 equals() 这种自然的 Java 样式来校验参数值.有时候,当需要有其他一些灵活性的时候,你可能会要求使用参数匹配(argument matchers). 请参考下面的 ...

  7. EassyMock实践 自定义参数匹配器

    虽然easymock中提供了大量的方法来进行参数匹配,但是对于一些特殊场合比如参数是复杂对象而又不能简单的通过equals()方法来比较,这些现有的参数匹配器就无能为力了.easymock为此提供了I ...

  8. ASP.NET Core 中的SEO优化(3):自定义路由匹配和生成

    前言 前两篇文章主要总结了CMS系统两个技术点在ASP.NET Core中的应用: <ASP.NET Core 中的SEO优化(1):中间件实现服务端静态化缓存> <ASP.NET ...

  9. SpringMVC中的自定义参数绑定案例

    由于日期数据有很多种格式,所以springmvc没办法把字符串转换成日期类型.所以需要自定义参数绑定.前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适 ...

随机推荐

  1. android逆向分析之smali语法

    一 .smali数据类型 1.Dalvik字节码 Davlik字节码中,寄存器都是32位的,能够支持任何类型,64位类型(Long/Double)用2个连续的寄存器表示: Dalvik字节码有两种类型 ...

  2. 进击的Android注入术《一》

    写在前面 这个系列本来是在公司的一个分享.内容比較多,所以就把这个PPT又一次组织整理成博客,希望对大家学习有所帮助.我会先以一个"短信拦截"作为样例,抛出问题,并提出了一种基于& ...

  3. 213. String Compression【easy】

    Implement a method to perform basic string compression using the counts of repeated characters. For ...

  4. redis命令_SETEX

    SETEX key seconds value 将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位). 如果 key 已经存在, SETEX 命令将覆写旧值 ...

  5. poj Ping pong LA 4329 (树状数组统计数目)

    Ping pong Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2302   Accepted: 879 Descript ...

  6. Linux之精灵进程

    一.引言 工作中有时候可能会写一些这样的程序,它作为后台进程运行,生命周期比一般的进程要长,它在系统开机时运行,直到被强制关闭或者系统关机时退出.它就是精灵进程或者也叫做守护进程--daemon pr ...

  7. C# 一个长度为100的int数组,插入1-100的随机数,不能重复,如何写

    int[] intArr = new int[100]; ArrayList myList = new ArrayList(); Random rnd = new Random(); while (m ...

  8. 启动项目时tomcat问题汇总

    最近SVN上迁下来的新项目,在刚运行项目时tomcat就报错了.以前也经常遇到,没太引起注意,今天终于决定将这个问题好好总结一下. 首先 1.错误:An internal error occurred ...

  9. PHP 操作SQLite

    连接数据库 下面的 PHP 代码显示了如何连接到一个现有的数据库.如果数据库不存在,那么它就会被创建,最后将返回一个数据库对象. <?php class MyDB extends SQLite3 ...

  10. 错误 1 error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead

    错误简介 在VS 2012 中编译 C 语言项目,如果使用了 scanf 函数,编译时便会提示如下错误: 原因是Visual C++ 2012 使用了更加安全的 run-time library ro ...