首先,简单说说PowerMockito进行单元测试的三部曲:

打桩,即为非测试目标方法设置返回值,这些返回值在测试目标方法中被使用。
执行测试,调用测试目标方法。
验证测试结果,如测试方法是否被执行,测试结果是否正确等。
其次,在使用PowerMockito框架进行单元测试的过程中,经常遇到如下异常:

Invalid use of argument matchers!
0 matchers expected, 1 recorded:
-> at com.mycompany.myproject.mypackage.MyTestClass.myTestMethod(MyTestClass.java:65)
This exception may occur if matchers are combined with raw values:
//incorrect:
someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
//correct:
someMethod(anyObject(), eq("String by matcher"));
For more info see javadoc for Matchers class.
乍一看似乎找不到北,先看看下面的代码再说。

被测试方法如下:

public boolean toggleOffOn(int delaySeconds) {
boolean off = powerOff();
sleep(delaySeconds);
boolean on = powerOn();
return off && on;
}
测试用例中的测试方法片段如下:

PowerMockito.when(ps.powerOn()).thenReturn(true);
PowerMockito.when(ps.powerOff()).thenReturn(true);
PowerMockito.when(ps.toggleOffOn(Mockito.anyInt())).thenReturn(true);//throws exception here
异常分析:

从异常的位置来看,该异常发生在打桩阶段,还未执行到真正的测试。

从异常的信息来看,显然违反了一个Mockito框架中的Matchers匹配参数的规则。根据Matchers文档如下,在打桩阶段有一个原则,一个mock对象的方法,如果其若干个参数中,有一个是通过Matchers提供的,则该方法的所有参数都必须通过Matchers提供。而不能是有的参数通过Matchers提供,有的参数直接给出真实的具体值。

If you are using argument matchers, all arguments have to be provided by matchers.
E.g: (example shows verification but the same applies to stubbing):

verify(mock).someMethod(anyInt(), anyString(), eq("third argument"));
//above is correct - eq() is also an argument matcher
verify(mock).someMethod(anyInt(), anyString(), "third argument");
//above is incorrect - exception will be thrown because third argument is given without argument matcher.

Matcher methods like anyObject(), eq() do not return matchers. Internally, they record a matcher on a stack and return a dummy value (usually null).
上述文档中给出的示例,可以使用eq()方法将真实的具体值转换为Matchers提供的值。

解决方法:

给出具体值
PowerMockito.when(ps.toggleOffOn(3)).thenReturn(true);
或直接去掉(仅适用于该测试用例)
PowerMockito.when(ps.toggleOffOn(Mockito.anyInt())).thenReturn(true);

注意:在Mockito 1.x中,org.mockito.Matchers已经过时,org.mockito.Mockito继承自Matchers,用以取代Matchers。

参考链接:

http://static.javadoc.io/org.mockito/mockito-core/1.10.19/org/mockito/Matchers.html

PowerMockito单元测试中的Invalid use of argument matchers问题详解的更多相关文章

  1. 单元测试系列之十一:Jmockit之mock特性详解

    本文是Jmockit学习过程中,根据官网所列的工具特性进行解读. 1.调用次数约束(Invocation count constraints) 可以通过调用计数约束来指定预期和/或允许匹配给定期望的调 ...

  2. Node.js中的不安全跳转如何防御详解

    Node.js中的不安全跳转如何防御详解 导语: 早年在浏览器大战期间,有远见的Chrome认为要运行现代Web应用,浏览器必须有一个性能非常强劲的Java引擎,于是Google自己开发了一个高性能的 ...

  3. python中日志logging模块的性能及多进程详解

    python中日志logging模块的性能及多进程详解 使用Python来写后台任务时,时常需要使用输出日志来记录程序运行的状态,并在发生错误时将错误的详细信息保存下来,以别调试和分析.Python的 ...

  4. 转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解

    Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解   多线程c语言linuxsemaphore条件变量 (本文的读者定位是了解Pthread常用多线程API和Pthread互斥锁 ...

  5. Android中Intent传值与Bundle传值的区别详解

    Android中Intent传值与Bundle传值的区别详解 举个例子我现在要从A界面跳转到B界面或者C界面   这样的话 我就需要写2个Intent如果你还要涉及的传值的话 你的Intent就要写两 ...

  6. ORACLE中RECORD、VARRAY、TABLE的使用详解(转)

    原文地址:ORACLE中RECORD.VARRAY.TABLE的使用详解

  7. Java集合中List,Set以及Map等集合体系详解

    转载请注明出处:Java集合中List,Set以及Map等集合体系详解(史上最全) 概述: List , Set, Map都是接口,前两个继承至collection接口,Map为独立接口 Set下有H ...

  8. 对python3中pathlib库的Path类的使用详解

    原文连接   https://www.jb51.net/article/148789.htm 1.调用库 ? 1 from pathlib import 2.创建Path对象 ? 1 2 3 4 5 ...

  9. Python的Django框架中forms表单类的使用方法详解

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

随机推荐

  1. 【GStreamer开发】GStreamer基础教程11——调试工具

    目标 有时我们的应用并没有按照我们的预期来工作,并且在总线上获得的错误信息也没有足够的内容.这时我们该怎么办呢?幸运的时,GStreamer自身提供了大量的调试信息,通常这些信息会给出一些线索,指向出 ...

  2. linux 下修改时间

    修改linux的时间可以使用date指令 date命令的功能是显示和设置系统日期和时间. 输入date 查看目前系统时间. 修改时间需要 date -功能字符 修改内容 命令中各选项的含义分别为: - ...

  3. Eclipse使用JDBC方式连接SQLServer2017

    这篇博客写的比较详细了,图文并茂: https://blog.csdn.net/rebekahq/article/details/78691343 这里补充一些可能会遇到的问题: 1.与博客中不同之处 ...

  4. Win + Manjaro 双系统、双硬盘安装方法 正确引导系统方法 黑屏解决方法(不瞎写,百分百有用)

    1. 前言 本教程只涉及 Win + Manjaro 双系统.双硬盘安装过程中的核心要点,不涉及具体步骤,不注意这些要点,安装之后是进不去 Manjaro 系统的. 详细的安装步骤网上已经有很多了,这 ...

  5. 解决warning: Clock skew detected. Your build may be incomplete

    原因:机器系统时间与文件时间不一致 解决:更新所有文件的时间后重新编译 find . -type f | xargs -n 5 touch make clean make xargs  -n num ...

  6. MyBatis Generator 自动生成的POJO对象的使用(一)

    MyBatis Generator 会自动生成以下几种类型的对象(除非你使用MyBatis3DynamicSql 的运行环境): Java Model Objects(总是生成) SQL Map Fi ...

  7. 怎样判断当前浏览器是PC浏览器还是手机浏览器

    可以通过检测navigator.userAgent字段中是否有"mobi"字段来检测是PC浏览器还是手机浏览器: /mobi/i.test(window.navigator.use ...

  8. puppet工作原理及部署redis主从篇

    一.简介 1.国际惯例什么是puppet puppet是一种Linux.Unix.windows平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件.用户.cron任务.软件包.系统 ...

  9. Spring Cloud Alibaba学习笔记(5) - 整合Sentinel及Sentinel规则

    整合Sentinel 应用整合Sentinel 在dependencies中添加依赖,即可整合Sentinel <dependency> <groupId>com.alibab ...

  10. hdu 1045 要求全部逐一搜索完的深搜

    #include<stdio.h> #include<string.h> int visit[10][10]; char map[10][10]; int n,ans,ss,t ...