虽然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);
}
}
分享到:
相关推荐
开玩笑的 自定义笑话匹配器以测试React Native的状态。目录问题您想用来编写测试,以断言关于React Native应用程序状态的各种事情。 作为该目标的一部分,您希望避免这样做时出现的所有重复模式,例如检查本机元素的...
自定义 Hamcrest 匹配器的集合 Android 的 TableLayout 匹配器包括: 查看具有指定视图的行下方的 N 行 视图是具有指定子索引的视图组的成员 与指定视图在同一行的视图 指定行和列交叉点处的视图 安卓版 ...
载货车动力装置参数匹配 配matlab图和程序.pdf载货车动力装置参数匹配 配matlab图和程序.pdf载货车动力装置参数匹配 配matlab图和程序.pdf载货车动力装置参数匹配 配matlab图和程序.pdf载货车动力装置参数匹配 配...
想做一个QT版本的查找编辑框(类似百度,输入关键词自动列出匹配结果),QComplater无法自定义匹配规则(模糊匹配),网上找了一些,或多或少都有bug,因此自己写了一个,基本上还算完美,不过细节没做优化。
可以在此匹配器的基础上实现自定义的判断、匹配、校验等功能,也可在此工具的基础上实现权限控制组件;当然也可以通过扩展/实现yakoo5.matcher.Matcher接口来实现自定义的匹配器,满足业务相关的功能。 《yakoo5....
hamcrest-string-matcher 自定义hamcrest匹配器,用于计算子字符串的出现次数。当前的版本当前版本是0.0.5。基本用法 import static io.zinx.hamcrest.string.pattern.OccurrenceMatcher.hasOccurrenceCount;... @...
可以在此匹配器的基础上实现自定义的判断、匹配、校验等功能,也可在此工具的基础上实现权限控制组件;当然也可以通过扩展/实现yakoo5.matcher.Matcher接口来实现自定义的匹配器,满足业务相关的功能。 《yakoo5....
[所有贡献者]( )](# ) 茉莉花 自定义茉莉花匹配器以测试DOM的状态 问题您想使用Jasmine编写测试来断言有关DOM状态的各种事情。 作为该目标的一部分,您希望避免这样做时出现的所有重复模式。 检查元素的属性,其...
自定义笑话匹配器以测试DOM的状态 问题 您想使用来编写断言有关DOM状态的各种测试。 作为该目标的一部分,您希望避免这样做时出现的所有重复模式。 检查元素的属性,其文本内容,其CSS类,然后为其命名。 这个解决...
在django 采用rest framework开发过程中遇到参数限制,无法自定义参数,只能根据model来定义匹配字段,搜索字段, 排序字段,在实际开发过程中存在根据其他字段来对返回结果做一定限制时,便存在一些不足,根据源码...
文章参考某款电动汽车的整车参数和性能指标,基于MATLAB App Designer开发设计一款App,实现电动汽车的驱动电机、动力电池和传动比的关键参数匹配。该款App能够使电动汽车的参数匹配计算提供便利,也为后续应用程序开发...
找不到与以下参数匹配的产品: channelId: VisualStudio.15.Release productId: Microsoft.Vis ,找了很多网上的方法都行不通,今天试了下可以,找了一个网上的卸载VS注册表等类的工具,卸载完就可以下载了。...
Jasmine 和 Jest 的自定义不可变匹配器 为相关检查添加一组自定义匹配器。 匹配器提供尽可能有用的自定义错误消息,以便在出现故障时您可以快速查明问题。 匹配器列表 不可变 不可迭代的不可变 toBeKeyedImmutable...
根据openflow协议,自定义匹配域或者action
纯电动汽车动力系统参数匹配及性能分析
例如,可以使用此笑话匹配器来期望以正确的顺序给出函数或cli的参数。 安装 $ npm install --save-dev expect-partial-array # or $ yarn add -D expect-partial-array 用法 import "expect-partial-array" ; expect...
代码包含: EscapeUtil.java:特殊字符(\,_,%)转义工具类 MyQueryInterceptor.java: Mybatis自定义拦截器 注意:该拦截器只支持QueryWrapper的like方法,serviceImpl层传全角模糊查询(%%) mapper或xml层的全角模糊查询(%...
VBA图片匹配自定义函数.xlsm
载货车动力装置参数匹配 配matlab图和程序.docx载货车动力装置参数匹配 配matlab图和程序.docx载货车动力装置参数匹配 配matlab图和程序.docx载货车动力装置参数匹配 配matlab图和程序.docx载货车动力装置参数匹配 ...
匹配器提供了一些自定义的错误消息,这些消息将尽力提供帮助,以便在出现故障时快速找出问题所在。 匹配器列表 存在 到长度 toHaveId toHaveClass toHaveTag 到 到HaveProp 到文本 到数据 拥有价值 到HaveCss ...