虽然easymock中提供了大量的方法来进行参数匹配,但是对于一些特殊场合比如参数是复杂对象而又不能简单的通过equals()方法来比较,这些现有的参数匹配器就无能为力了。easymock为此提供了IArgumentMatcher 接口来让我们实现自定义的参数匹配器。

我们还是用例子来说话:

要测试的接口

package MockTest;

public interface Service {
void execute(Request request, MData[] mdata, int mode);
}

参数类型定义

package MockTest;

public class Request {
private boolean condition; private String value1; private String value2; public boolean isCondition() {
return condition;
} public String getValue1() {
return value1;
} public String getValue2() {
return value2;
} public void setCondition(boolean condition) {
this.condition = condition;
} public void setValue1(String value1) {
this.value1 = value1;
} public void setValue2(String value2) {
this.value2 = value2;
} public Request(boolean condition, String value1, String value2) {
super();
this.condition = condition;
this.value1 = value1;
this.value2 = value2;
} }
package MockTest;

public class MData {
public byte[] key;
public byte[] data; public MData(byte[] key, byte[] data) {
super();
this.key = key;
this.data = data;
} public String toString() {
return "key: " + new String(key) + ", data: " + new String(data);
}
}

自定义匹配器

假设在我们的这个单独的测试案例中,我们有以下参数匹配逻辑: 如果condition为true,则只需要比较value1;如果condition为false,则只需要比较value2. 由于这个逻辑和默认的equals方法不一致,因此我们不能直接使用equals方法,只能实现自己的参数匹配器。

package MockTest;

import org.easymock.EasyMock;
import org.easymock.IArgumentMatcher; public class RequestMatcher implements IArgumentMatcher { private boolean condition; private String expectedValue; private RequestMatcher(boolean condition, String expectedValue) {
this.condition = condition;
this.expectedValue = expectedValue;
} @Override
public void appendTo(StringBuffer buffer) {
buffer.append("RequestMatcher expect(condition=");
buffer.append(condition);
buffer.append(" expectedValue=");
buffer.append(expectedValue);
buffer.append(")");
} @Override
public boolean matches(Object argument) {
if (!(argument instanceof Request)) {
return false;
} Request request = (Request) argument;
if (condition) {
return expectedValue.equals(request.getValue1());
} else {
return expectedValue.equals(request.getValue2());
}
} public static Request requestEquals(boolean condition, String expectedValue) {
EasyMock.reportMatcher(new RequestMatcher(condition, expectedValue));
return null;
}
}

EqualsMData是为了演示当参数是对象数组的时候怎么实现参数匹配的.关键是要把Object对象强制性转换为对象数组.

package MockTest;

import org.easymock.EasyMock;
import org.easymock.IArgumentMatcher; //实现IArgumentMatcher接口
class EqualsMData implements IArgumentMatcher {
private MData[] expect; private MData[] actual; public EqualsMData(MData[] expect) {
this.expect = expect;
} public static MData[] ZSMDataEquals(MData[] expect) {
//提交匹配要的自定义类
EasyMock.reportMatcher(new EqualsMData(expect));
return null;
} @Override
//这个方法实现匹配参数的逻辑
public boolean matches(Object argument) { //this method only can mathch one single parameter
System.out.println("argument is" + argument);
// TODO Auto-generated method stub
if (argument == this.expect)
return true; if (!(argument instanceof MData[]))
return false; //matches没有提供接收数组的方法, 所以这里必须强制转换OjectweiMData[]
actual = (MData[]) argument; int length = expect.length;
if (length != actual.length)
return false; for (int i = 0; i < length; i++) {
// if (expect[i].key != actual[j].key || expect[i].data != actual[j].data) //error
if (!expect[i].toString().equals(actual[i].toString()))
// if(!Arrays.equals(expect, actual))//error
{
return false;
}
} return true;
} @Override
//这个方法是匹配错误后要打印的信息
public void appendTo(StringBuffer buffer) {
// TODO Auto-generated method stub buffer.append("EqualsMPut expect is: \n");
for (int i = 0; i < expect.length; i++) {
buffer.append(expect[i].toString());
} buffer.append(" but actual is: \n"); for (int j = 0; j < actual.length; j++) {
buffer.append(expect[j].toString());
}
} }

测试

package MockTest;

import org.easymock.*;
import org.junit.*;
import static org.easymock.EasyMock.*; public class TestEasyMock { @Test
public void testConditionTrueFailure() {
final boolean expectedCondition = true;
final String expectedValue = "aaa"; Service service = EasyMock.createMock("service", Service.class);
MData[] datas = { new MData("1001".getBytes(), "2001".getBytes()),
new MData("1002".getBytes(), "2002".getBytes()),
new MData("1003".getBytes(), "2003".getBytes()) }; Request request = new Request(expectedCondition, "aaa", "ccc"); //参数匹配器每次只能实现一个参数匹配,所以对于多个参数,要实现多个自定义匹配器
service.execute(
RequestMatcher.requestEquals(expectedCondition, expectedValue),
EqualsMData.ZSMDataEquals(datas), anyInt());
EasyMock.expectLastCall(); EasyMock.replay(service);
// MData[] datas2 = { new MData("1001".getBytes(), "2001".getBytes())};
service.execute(request, datas, 1);
EasyMock.verify(service);
}
}

EassyMock实践 自定义参数匹配器的更多相关文章

  1. Mockito 2 参数匹配器

    Mockito 通过使用 equals() 这种自然的 Java 样式来校验参数值.有时候,当需要有其他一些灵活性的时候,你可能会要求使用参数匹配(argument matchers). 请参考下面的 ...

  2. Flask入门之自定义过滤器(匹配器)

    1.  动态路由的匹配器? 不知道这种叫啥名,啥用法,暂且叫做匹配器吧. Flask自带的匹配器可以说有四种吧(保守数字,就我学到的) 动态路由本身,可以传任何参数字符串或者数字,如:<user ...

  3. EassyMock实践 捕获参数

    在测试接口过程中,有时我们希望知道自己期望传入的参数是什么,以此来判断传入参数的正确行,这时就需要用到EassyMock的capture方法.该方法能捕获传入的参数存放到自定义的变量中,然后用捕获的参 ...

  4. Hamcrest匹配器框架

    其实在之前的文章中已经使用过 Hamcrest 匹配器框架,本篇文章将系统的介绍它的使用. 为什么要用Hamcrest匹配器框架 Hamcrest是一款软件测试框架, 可以通过现有的匹配器类检查代码中 ...

  5. Rspec: everyday-rspec实操。FactoryBot预构件 (rspec-expectations gem 查看匹配器) 1-4章

    总文档连接: RSpec.info/documentation/ 包括core, expectiation,rails , mock, 点击最新版本,然后右上角搜索class, method. 第3章 ...

  6. 关于 Shiro 的权限匹配器和过滤器

    项目源码:https://github.com/weimingge14/Shiro-project演示地址:http://liweiblog.duapp.com/Shiro-project/login ...

  7. Junit 断言 assertThat Hamcrest匹配器

    junit断言总结本文参考了http://blog.csdn.net/wangpeng047/article/details/9628449一 junit断言1.JUnit框架用一组assert方法封 ...

  8. BF匹配器

    对于BF匹配器,首先我们得用cv2.BFMatcher()创建BF匹配器对象.它取两个可选参数,第一个是normType.它指定要使用的距离量度.默认是cv2.NORM_L2.对于SIFT,SURF很 ...

  9. [Google Guava]字符串处理:连接器、拆分器、字符匹配器

    一.连接器[Joiner] 二.拆分器[Splitter] 三.字符匹配器[CharMatcher] 四.字符集[Charsets] Charsets:针对所有Java平台都要保证支持的六种字符集提供 ...

随机推荐

  1. jquery 设置asp:dropdownlist 选中项

    $("#ddlPro").find('option').each(function () { this.selected = (this.text == dlprom); });

  2. Java基础笔记-String类

    String 类(被final修饰) 字符串是一种特殊的对象,一旦字符串被初始化就不可以被改变了.(内容不变) 例如: String  s = “abc”; String  s1 = new Stri ...

  3. UVA 11925 - Generating Permutations

    题意: 给出一个1到n的排列,给出操作顺序,使升序排列能变为所给排列. 分析: 正常冒泡排序的想法.如果前两个数,前面的大于后面的,则换(特例是n,1不能换).否则,就用2的逆操作,把最后的数放前面. ...

  4. EventBusException:xxxx has no methods onEvent

    使用第三方框架EventBus,在register时出现Exception:xxxx has no methods onEvent. 场景:在Activity中没有接收事件,只是需要发送事件,但是有对 ...

  5. CODEVS1047 邮票面值设计

    题目描述 Description 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤40)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1-MAX之 ...

  6. 关于jQuery中的ajax的方法介绍

           jQuery提供一系列Ajax函数方便我们调用Ajax, 其中最核心也是最复杂的是jQuery.ajax(),所有的其他Ajax函数都是它的一个简化调用.当我们想要完全控制Ajax时可以 ...

  7. linux dd命令

    dd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 1. 命令简介 dd 的主要选项: 指定数字的地方若以下列字符结尾乘以相应的数 ...

  8. ASP.NET MVC 中使用 UEditor 富文本编辑器

    在上篇<使用ASP.NET MVC+Entity Framework快速搭建博客系统>中,已经基本上可以实现博客分类和博客文章的CURD.但是,文章编辑界面实在是…… 好吧,咱得搞专业点. ...

  9. 几种常用单片机I/O口线的驱动能力

    摘要: 详细分析了几种常见单片机的I/O口结构,并据此分析其驱动能力大小 在控制系统中,经常用单片机的I/O口驱动其他电路.几种常用单片机I/O口驱动能力在相关的资料中的说法是:GMS97C2051. ...

  10. [置顶] 实习总结3-job hunting(西安工作)

    开始整理关于西安top level的IT企业的工作从去年开始实习就慢慢展开了,到了北京之后一直关注的比较密切,因此前前后后也整理了很多.本来不打算那么急着写这一篇的,但是在因为在公司呆着,对于西安的一 ...