Mockito自定义verify参数Matcher

在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的实例。

作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客博客园--破狼51CTO--破狼。http://www.cnblogs.com/whitewolf/p/4092359.html

时间: 2024-08-22 07:46:58

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

解决Zabbix自定义用户参数无法获取到数据的问题

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1676500 今天在一台被监控的主机上写了一个用户参数(UserParameter),用于监控这台主机上的一个pid,还有一些别的用户参数,其他的用户参数都正确获得了,唯独这个后加的pid始终没有获得到数据,服务和日志都重启查看了,没有任何报错,也试过将pid的这个值设置成text和number,但都始终无法获取到这

c# WebService soap 序列化. webservice 自定义类参数序列化的问题.

问题描述 Webservice接口如下:[WebMethod]publicvoidSetCacheValue(stringkey,objectvalue){Cache.Insert(key,value);}在客户端有如下的调用:WebserviceInterface.ClassNamei=newWebserviceInterface.ClassName();ClassEntityAentityA=newClassEntityA();entityA.strA="a";ClassEntit

wsdl-axis1.4调用webservice 传递自定义对象参数出错

问题描述 axis1.4调用webservice 传递自定义对象参数出错 调用客户端后出现: org.xml.sax.SAXException: Invalid element in cn.services.QueryEquipmentRequest - queryEquipmentRequest 客户端代码(其中queryEquipmentRequest,QueryEquipmentResponse是我自定义的对象): call.addParameter(new QName(nameSpace

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

随心所欲,自定义参数解析器绑定数据. 题图:from Zoommy 干货 SpringMVC解析器用于解析request请求参数并绑定数据到Controller的入参上. 自定义一个参数解析器需要实现HandlerMethodArgumentResolver接口,重写supportsParameter和resolveArgument方法,配置文件中加入resolver配置. 如果需要多个解析器同时生效需要在一个解析器中对其他解析器做兼容 缘起 为什么要自定义一个解析器呢? 源于需要对前端请求参数

MS CRM 2011 如何配置表单接受自定义Querystring参数

在前面的两篇文章中,我分别介绍了如何自定义Ribbon按钮并向其传递参数以及Ribbon按钮与其背后JScript的工作原理.在这篇文章中,我结合前面介绍到的知识,再为大家演示一下如何在表单中传递自定义的参数. 我们还是以扩展Connect按钮为例子,这一节我们安排"To Interest http://www.aliyun.com/zixun/aggregation/16860.html">Partner"这个子选项多做一些事情.如果你点击"Connect

javascript中自定义函数参数添加默认值实现方法

最近在Codewars上面看到一道很好的题目,要求用JS写一个函数defaultArguments,用来给指定的函数的某些参数添加默认值.举例来说就是: // foo函数有一个参数,名为xvar foo_ = defaultArguments(foo, {x:3});// foo_是一个函数,调用它会返回foo函数的结果,同时x具有默认值3 下面是一个具体的例子: function add(a, b) {return a+b;} // 给add函数的参数b添加默认值3 var add_ = de

wordpress自定义url参数实现路由功能的代码示例_php实例

经过两天的正则表达式的学习,和研究wordpress的路由函数,成功实现了自定义wordpress路由功能,以下是路由规则的实现.如果有自定义的url参数,要通过路由传递,必须通过wordpress的函数将参数添加进去: 复制代码 代码如下: //add query_argsfunction add_query_vars($aVars) {    $aVars[] = 'score';    $aVars[] = 'type'; // represents the name of the pro

Android 自定义View 参数

问题描述 这是我自定义View 的源码:public class MyView extends View {private float px;private float py;private int flag ;private Bitmap map;public MyView(Context context,float p_x,float p_y,int flag) {super(context);this.px=p_x;this.py=p_y;this.flag=flag;System.out

log4j 自定义的参数在业务中怎样获取?

问题描述 log4j.rootLogger=DEBUG,DATABASE log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender log4j.appender.DATABASE.URL=jdbc:db2://10.1.16.210:50000/TKLPF_DBlog4j.appender.DATABASE.driver=com.ibm.db2.jcc.DB2Driverlog4j.appender.DATABASE.user=admi