Mockito自定义verify参数Matcher

简介:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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);
     }
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@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/p/4092359.html,如需转载请自行联系原作者

目录
相关文章
|
安全 Java 编译器
解决Java中的“Unchecked cast: java.lang.Object to java.util.List”问题
解决Java中的“Unchecked cast: java.lang.Object to java.util.List”问题
1312 0
|
12月前
|
安全 算法 Java
Java CAS原理和应用场景大揭秘:你掌握了吗?
CAS(Compare and Swap)是一种乐观锁机制,通过硬件指令实现原子操作,确保多线程环境下对共享变量的安全访问。它避免了传统互斥锁的性能开销和线程阻塞问题。CAS操作包含三个步骤:获取期望值、比较当前值与期望值是否相等、若相等则更新为新值。CAS广泛应用于高并发场景,如数据库事务、分布式锁、无锁数据结构等,但需注意ABA问题。Java中常用`java.util.concurrent.atomic`包下的类支持CAS操作。
457 2
|
SQL 关系型数据库 MySQL
MySQL-在线处理大表数据 & 在线修改大表的表结构
MySQL-在线处理大表数据 & 在线修改大表的表结构
591 0
|
SQL 关系型数据库 数据库
Flink CDC产品常见问题之SQLserver cdc 开启 cdc表没有记录如何解决
Flink CDC(Change Data Capture)是一个基于Apache Flink的实时数据变更捕获库,用于实现数据库的实时同步和变更流的处理;在本汇总中,我们组织了关于Flink CDC产品在实践中用户经常提出的问题及其解答,目的是辅助用户更好地理解和应用这一技术,优化实时数据处理流程。
1218 0
|
网络协议
IPTables六—— IPTable规则优化IPSet
六、IPSet iptables在进行包过滤的时候,对每个数据包都过滤一遍iptables中的规则。假设我们有如下三条规则: -s 1.1.1.1 -p tcp accpet -s 2.2.2.2 -p tcp accpet -s 3.3.3.3 -p tcp accpet 那么当一个数据包源地址是3.3.3.3的时候,它首先去匹配第一条规则,不匹配再匹配第二条,最后在第三条匹配中了。
1501 0
|
安全 fastjson Java
Unchecked cast: java.lang.Object to java.util.List问题的解决
Unchecked cast: java.lang.Object to java.util.List问题的解决
2367 0
Unchecked cast: java.lang.Object to java.util.List问题的解决
|
SQL 存储 安全
docker 安装sqlserver数据库并开启代理(保姆级)
docker 安装sqlserver数据库并开启代理(保姆级)
2751 0
Charles 如何扑获 curl 和 Postman 请求 #66
Charles 如何扑获 curl 和 Postman 请求 #66
587 1
|
监控 NoSQL Java
锁重试和续约? Redisson: 不错, 正是在下 (源码解读)
这是最详细的Redisson锁重入, 锁重试, Watchdog看门狗, 锁续约机制源码讲解 Redisson分布式锁原理:可重入:利用hash结构记录线程id和重入次数可重试:利用信号量和PubSub功能实现等待、唤醒,获取锁失败的重试机制超时续约:利用watchDog,每隔一段时间(releaseTime), 重置超时时间
2459 0
|
NoSQL 关系型数据库 MySQL
MySQL 常见死锁场景 -- 并发Replace into导致死锁
### MySQL Replace into issue MySQL 并发 Replace into 引起死锁问题 在之前的文章 [#issue 68021 MySQL unique check 问题](https://zhuanlan.zhihu.com/p/503880736)中, 我们已经介绍了在 MySQL 里面, 由于唯一键的检查(unique check), 导致 MySQ
739 0