前两天写单元测试的时候,发现一个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. DDR 复位

    将FPGA代码和实际的数字电路对应起来. always @ (negedge clk_ref_200)     begin     if(ddr3_init_done)    'b10)   'b10 ...

  2. Visual Studio 环境配置

    一.Productivity Power Tools 1.安装了之后有垂直的分隔线,取消 2.高亮选中匹配的代码 ① VS 2012 3.高亮当前的Tab选项卡

  3. java 读写文件常用方法

    package study.bigdata; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; ...

  4. IP代理软件

    IP代理软件 IP代理软件就是通过第三方网络协议传输数据的一种加密软件:跟VPN,代理服务器原理一样,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通 过这个服务与另一个网络终端(一般为服务器 ...

  5. makefile的选项LDFLAGS和LIBS的区别

    LDFLAGS是选项,LIBS是要链接的库.都是喂给ld的,只不过一个是告诉ld怎么吃,一个是告诉ld要吃什么. 网上不难搜索到上面这段话.不过“告诉ld怎么吃”是什么意思呢? 看看如下选项: LDF ...

  6. 【ATX学习大纲】【ATX基于uiautomator2+Python学习】之Android自动化

    github学习地址:https://github.com/openatx/uiautomator2 <_io.TextIOWrapper name='<stderr>' mode= ...

  7. android Bitmap用法总结(转载)

    Bitmap用法总结1.Drawable → Bitmappublic static Bitmap drawableToBitmap(Drawable drawable) {Bitmap bitmap ...

  8. C++ 抽象类二(抽象类的基本语法)

    //抽象类的基本语法 #include<iostream> using namespace std; /* 有关多继承的说明 被实际开发经验抛弃的多继承 工程开发中真正意义上的多继承是几乎 ...

  9. eclipse 下安装 lombok.jar

    lombok是一个java 开发插件,可以用来简化代码, 1. 下载lombok.jar https://projectlombok.org/download 2 将lombok.jar文件放在ecl ...

  10. 目标跟踪之卡尔曼滤波---理解Kalman滤波的使用预测

    Kalman滤波简介 Kalman滤波是一种线性滤波与预测方法,原文为:A New Approach to Linear Filtering and Prediction Problems.文章推导很 ...