在TDD开发中,也许我们会遇见对一些重要的无返回值的行为测试,比如在用户的积分DB中增加用户的积分,这个行为对于我们的业务具有重要的价值,所以我们也希望能测试覆盖这部分业务价值。这个时候我们就得使用mockito带来的verify断言,但verify的参数断言主要有eq,或者any常见的方式。有时我们也希望能够断言对象的一部分属性,比如上文的积分数值,对于不同的场景增加的用户积分可能不同。

回到Mockito的参数Matcher,Mockito给我们提供了ArgumentMatcher,以供我们来扩展Matcher。下面假设一个增加用户积分的场景:

 public class Game {
private String type;
private int rate; public Game(String type, int rate) {
this.type = type;
this.rate = rate;
} public String getType() {
return type;
} public int getRate() {
return rate;
} } public class GameDao {
public void addRate(Game game) {
//TODO: insert to db
}
}

  

我们希望能够对verify GameDao调用了addRate,并且是积分rate为特定值。

所以我们可以扩展Mockito的ArgumentMatcher:

public class PartyMatcher<T> extends ArgumentMatcher<T> {
private Object value;
private Function<T, Object> function; public PartyMatcher(Function<T, Object> getProperty, Object value) {
this.value = value;
this.function = getProperty;
} public static <F> PartyMatcher<F> partyMatcher(Function<F, Object> getProperty, Object value) {
return new PartyMatcher<F>(getProperty, value);
} @Override
public boolean matches(Object o) {
return function.apply((T) o).equals(value);
}
}

所以我们的测试可以如下:

    @Test
public void should_run_customer_mockito_matcher() throws Exception { final GameDao gameDao = mock(GameDao.class);
gameDao.addRate(new Game("签到", 7)); verify(gameDao).addRate(argThat(new PartyMatcher<Game>(new Function<Game, Object>() {
@Override
public Object apply(Game game) {
return game.getRate();
}
}, 7))); verify(gameDao).addRate(argThat(new PartyMatcher<Game>(new Function<Game, Object>() {
@Override
public Object apply(Game game) {
return game.getType();
}
}, "签到")));
}

  

Mockito给我们提供了很多关于Matcher扩展的方法,本文只是ArgumentMatcher的实例。

Mockito自定义verify参数Matcher的更多相关文章

  1. 一步一步自定义SpringMVC参数解析器

    随心所欲,自定义参数解析器绑定数据. 题图:from Zoommy 干货 SpringMVC解析器用于解析request请求参数并绑定数据到Controller的入参上. 自定义一个参数解析器需要实现 ...

  2. elastic-job详解(五):自定义任务参数

    在elastic-job详解(三):Job的手动触发功能一文中讲到了如何手动触发一个Job,但是我们手动触发的时候常常需要输入一些参数.举个栗子:我们有个日统计报表,每天凌晨统计一次,统计上一天的数据 ...

  3. 自定义spring参数注解 - 打破@RequestBody单体限制

    本文主要描述怎样自定义类似@RequestBody这样的参数注解来打破@RequestBody的单体限制. 目录1 @RequestBody的单体限制2 自定义spring的参数注解3 编写sprin ...

  4. Log4j2 中format增加自定义的参数

    首先收藏一下log4j2的官网:http://logging.apache.org/log4j/2.x/manual/plugins.html#TypeConverters 对于这种需要,可以使用lo ...

  5. Jenkins 传递自定义的参数

    1.同一个job之间,不同的shell之间传递参数 注意:如果是job参数化构建自定义的参数,可以在job的不同shellj间引用,但是不能改变他的值供后面的shell使用   job在执行时会针对所 ...

  6. 在Echarts 柱形图的单击事件中写入自定义的参数

    标签: 逻辑:(点击柱形图的某个实例(注意:三个柱子表示的是一个实例)) 参考链接:http://echarts.baidu.com/doc/example/event.html { name: ‘c ...

  7. Python之TensorFlow的变量收集、自定义命令参数、矩阵运算、梯度下降-4

    一.TensorFlow为什么要存在变量收集的过程,主要目的就是把训练过程中的数据,比如loss.权重.偏置等数据通过图形展示的方式呈现在开发者的眼前. 自定义参数:自定义参数,主要是通过Python ...

  8. SpringBoot自定义请求参数转换器

    需求 我们可能对接客户的系统的时候,虽然Spring为我们提供的很多方便的转换器,但是遇到还是可能遇到需要自定义请求参数转换器的情况. 日期转换器 SpringBoot默认是没有配置日期转换器的我们可 ...

  9. 163_技巧_Power BI 一键批量建立自定义字段参数

    163_技巧_Power BI 一键批量建立自定义字段参数 一.背景 在 2022 年 5 月开始,Power BI 新增了一个非常有用的功能字段参数.再也不用写一串的 SWITCH 了.字段参数的效 ...

随机推荐

  1. jQuery插件编写笔记

    插件的种类: 1.封装对象方法的插件. 2.封装全局函数的插件. 3.选择器插件. *所有的对象方法都应当附加到jQuery.fn对象上,而所有的全局函数都应当附加到jQuery对象本身上. *在插件 ...

  2. javascript设计模式(单体模式)

    主要内容: js中最基本.应用最广的模式就是单体模式,实现原理是将代码组织为一个逻辑单元,这个逻辑单元中的代码可以通过单一的变更进行访问,确保对象只存在一份实例. 单体模式的特点: 在网页中使用全局变 ...

  3. MySql之安装配置

    1.解压Mysql.zip后,添加bin目录的环境变量 2.配置my.ini文件中的 # basedir =D:\mysql-5.6.24-winx64 # datadir = D:\mysql-5. ...

  4. Unity 编辑器的 界面布局 保存方法

    在软件界面的右上角(关闭按钮的下方),点击  layout  (界面)的下拉箭头. 弹出选项中的 save layout....(保存界面选项),输入命名,就可以生成这个界面的布局.  (软件本身也有 ...

  5. Android Service完全解析,关于服务你所需知道的一切(上)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的A ...

  6. padding与margin的区别

    padding    是控件的内容相对控件的边缘的边距. margin      是控件边缘相对父空间的边距. android:gravity 属性是对该view 内容的限定.比如一个button 上 ...

  7. android studio 华为手机看不到具体的错误日志

    手机的开发人员选项打开了么,其中的 USB 调试打开了么?搞定他们并重新运行,是否能找到我们的日志?否,转到 2. 日志中是否有这样 could not disable core file gener ...

  8. JS-Dom概念

    <!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content=&q ...

  9. JavaScript-永远点不到的小窗口

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. gc roots 垃圾回收

    gc roots包括以下几个: 虚拟机栈(栈桢中的本地变量表)中的引用对象 方法区中的类静态属性引用的对象 方法区中的常量引用的对象 本地方法栈中JNI(即native方法)的引用的对象 java,c ...