`
Ydoing
  • 浏览: 105997 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

EassyMock实践 自定义参数匹配器

 
阅读更多

虽然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); } }
复制代码


分享到:
评论

相关推荐

    springmvc自定义属性编辑器和参数解析器

    在Spring MVC中,当控制器方法接收请求参数时,如果请求参数与方法参数类型不匹配,Spring会尝试使用属性编辑器进行转换。例如,从字符串转换为日期、颜色代码到Color对象等。自定义属性编辑器需要继承`java.beans....

    jest-native::eagle:自定义jest匹配器以测试React Native的状态

    开玩笑的 自定义笑话匹配器以测试React Native的状态。目录问题您想用来编写测试,以断言关于React Native应用程序状态的各种事情。 作为该目标的一部分,您希望避免这样做时出现的所有重复模式,例如检查本机元素的...

    Jest:Jest配置与自定义匹配器.docx

    Jest:Jest配置与自定义匹配器.docx

    自定义事件选择器

    本文将深入探讨自定义时间选择器的设计与实现,以及其在不同场景下的应用。 自定义时间选择器是一种允许用户根据特定需求定制的时间输入组件。在默认情况下,大多数编程库提供标准的时间选择器,但这些可能无法满足...

    CustomHamcrestMatchers:自定义 Hamcrest 匹配器的集合

    自定义 Hamcrest 匹配器的集合 Android 的 TableLayout 匹配器包括: 查看具有指定视图的行下方的 N 行 视图是具有指定子索引的视图组的成员 与指定视图在同一行的视图 指定行和列交叉点处的视图 安卓版 ...

    spring2.0(三) 自定义属性编辑器

    在Spring 2.0框架中,自定义属性编辑器(Custom Property Editor)是一个重要的功能,它允许开发者扩展Spring的默认属性绑定机制,以处理特定类型的转换。本文将深入探讨这一特性,结合源码分析和实际应用,帮助你...

    openflow自定义匹配域.docx

    OpenFlow自定义匹配域 OpenFlow协议是当前网络技术中广泛使用的一种southbound API,能够实现在网络设备上的流表管理、流量控制和网络虚拟化等功能。 OpenFlow协议中,匹配域是一个非常重要的概念,它是指一个流表...

    QT实现的类似QComplater可自定义匹配规则查找控件

    想做一个QT版本的查找编辑框(类似百度,输入关键词自动列出匹配结果),QComplater无法自定义匹配规则(模糊匹配),网上找了一些,或多或少都有bug,因此自己写了一个,基本上还算完美,不过细节没做优化。

    实用匹配器(Matcher)小工具 - 1.0.1

    可以在此匹配器的基础上实现自定义的判断、匹配、校验等功能,也可在此工具的基础上实现权限控制组件;当然也可以通过扩展/实现yakoo5.matcher.Matcher接口来实现自定义的匹配器,满足业务相关的功能。 《yakoo5....

    实用匹配器(Matcher)小工具

    可以在此匹配器的基础上实现自定义的判断、匹配、校验等功能,也可在此工具的基础上实现权限控制组件;当然也可以通过扩展/实现yakoo5.matcher.Matcher接口来实现自定义的匹配器,满足业务相关的功能。 《yakoo5....

    SpringMVC自定义参数绑定实现详解

    SpringMVC自定义参数绑定实现详解 SpringMVC自定义参数绑定实现详解主要介绍了SpringMVC自定义参数绑定实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以...

    传智播客struts2.1源代码_自定义类型转换器

    接着,当Struts2接收到相关参数时,会自动调用自定义转换器进行转换。 6. **调试与测试** 调试自定义类型转换器通常涉及到设置断点,观察转换过程中的变量状态,以及通过单元测试确保转换逻辑的正确性。在IDE如...

    jest-dom:自定义的jest匹配器以测试DOM的状态

    自定义笑话匹配器以测试DOM的状态 问题 您想使用来编写断言有关DOM状态的各种测试。 作为该目标的一部分,您希望避免这样做时出现的所有重复模式。 检查元素的属性,其文本内容,其CSS类,然后为其命名。 这个解决...

    C# - 实现自定义相等比较器

    在这个例子中:我们有一个Person带有Id属性和Name属性的类。Person我们创建一个代表人员集合的对象...通过实现自定义相等比较器,您可以根据您的特定需求定制相等比较逻辑,从而更轻松地处理复杂对象和自定义数据结构。

    QT自定义皮肤生成器

    最后,值得一提的是,尽管QT自定义皮肤生成器为界面设计带来了极大的便利,但开发者在使用的过程中,还需遵循一些最佳实践。例如,应该保证设计的界面风格与应用程序的功能和目的相匹配,避免过度追求视觉效果而牺牲...

    custom-immutable-matchers:为 Immutable 相关检查添加一组自定义匹配器

    Jasmine 和 Jest 的自定义不可变匹配器 为相关检查添加一组自定义匹配器。 匹配器提供尽可能有用的自定义错误消息,以便在出现故障时您可以快速查明问题。 匹配器列表 不可变 不可迭代的不可变 toBeKeyedImmutable...

    基于Qt自定义的滑动选择器

    2. **颜色定制**:允许开发者自定义选择器的背景色、滑块颜色、边框颜色等,以匹配应用的整体风格。 3. **值域设定**:可以设置滑动选择器的最小值和最大值,以及默认选中的初始值,这在处理数值范围或选项范围时...

    Unity-自定义颜色编辑器

    自定义颜色编辑器的开发旨在提供一个更灵活、用户友好的解决方案,使开发者能够快速、直观地处理颜色,提升工作效率。 通过构建自定义颜色编辑器,开发者可以: 简化工作流程:集成常用功能,让颜色选择和调整变得...

    VBA图片匹配自定义函数.xlsm

    VBA图片匹配自定义函数.xlsm

    swift-iOS中的高性能自定义点加载指示器

    总之,通过Swift自定义点加载指示器,开发者可以自由地调整样式,以匹配应用的整体设计风格,并通过优化代码提高性能,为用户提供更流畅的体验。这不仅提升了应用的专业感,也体现了开发者的技能和对用户体验的关注...

Global site tag (gtag.js) - Google Analytics