JMockit学习笔记

简介:

1 基本概念

1.1 常用注解

  • @Mocked:被修饰的对象将会被Mock,对应的类和实例都会受影响(同一个测试用例中)
  • @Injectable:仅Mock被修饰的对象
  • @Capturing:可以mock接口以及其所有的实现类
  • @Mock:MockUp模式中,指定被Fake的方法

1.2 常用的类

  • Expectations:期望,指定的方法必须被调用
  • StrictExpectations:严格的期望,指定方法必须按照顺序调用
  • NonStrictExpectations:非严格的期望,是否调用和顺序不作要求
  • Verifications:验证,一般配合NonStrictExpectations来使用
  • Invocation:工具类,可以获取调用信息
  • Delegate:自己指定返回值,适合那种需要参数决定返回值的场景,只需指定匿名子类就可以。
  • MockUp:模拟函数实现
  • Deencapsulation:反射工具类

2 使用实例

现有两个类如下:
SimpleTool.java:

public class SimpleTool {
    public String fun1(String str) {
        return "real: public String fun1(" + str + ")";
    }

    private String fun2(String str) {
        return "real: private String fun2(" + str + ")";
    }

    public String fun3(String str) {
        return "real: public String fun3(" + str + ")";
    }

    public String fun4(String str) {
        return fun2(str);
    }
}

UseSimpleTool.java:

public class UseSimpleTool {
    public String fun1(String name) {
        SimpleTool simpleTool = new SimpleTool();
        return simpleTool.fun1(name);
    }
}

2.1 Status-based

2.1.1 实例1:Mocked

@Mocked
SimpleTool simpleTool;

@Test
public void testExpectation() {

    //未mock函数返回null
    new Expectations() {
        {
            simpleTool.fun1(anyString);
            result = "MOCK";
        }
    };

    System.out.println(simpleTool.fun1("param"));
    System.out.println(simpleTool.fun3("param"));
    System.out.println(new UseSimpleTool().fun1("param"));

    new Verifications() {
       {
           simpleTool.fun1(anyString);
           times = 2;
       }
    };
}

输出:

MOCK
null
MOCK

2.1.2 实例2:Injectable

@Injectable
SimpleTool simpleTool;

@Test
public void testExpectation() {

    //未mock函数返回null
    new Expectations() {
        {
            simpleTool.fun1(anyString);
            result = "MOCK";
        }
    };

    System.out.println(simpleTool.fun1("param"));
    System.out.println(simpleTool.fun3("param"));
    System.out.println(new UseSimpleTool().fun1("param"));

    new Verifications() {
        {
            simpleTool.fun1(anyString);
            times = 1;
        }
    };
}

输出:

MOCK
null
real: public String fun1(param)

2.1.3 结果可变Delegate

@Mocked
SimpleTool simpleTool;

@Test
public void testExpectation() {

    new Expectations() {
        {
            simpleTool.fun1(anyString);
            result = new Delegate<String>() {
                public String aDelegateMethod(String str) {
                    return str.equals("param0") ? "MOCK0" : "MOCK1";
                }
            };
        }
    };

    System.out.println(simpleTool.fun1("param0"));
    System.out.println(simpleTool.fun3("param"));
    System.out.println(new UseSimpleTool().fun1("param1"));

    new Verifications() {
        {
            simpleTool.fun1(anyString);
            times = 2;
        }
    };
}

输出:

MOCK0
null
MOCK1

2.2 Behavior-based

2.2.1 Mock对象公有方法

@Test
public void testMockUp() {
    //影响该类所有实例
    new MockUp<SimpleTool>(){
        //未mock函数不受影响
        @Mock
        public String fun1(String str) {
            return "(MOCK)";
        }
    };

    SimpleTool simpleTool = new SimpleTool();
    System.out.println(simpleTool.fun1("param"));
    System.out.println(simpleTool.fun3("param"));
    UseSimpleTool useSimpleTool = new UseSimpleTool();
    System.out.println(useSimpleTool.fun1("param"));
}

输出:

(MOCK)
real: public String fun3(param)
(MOCK)

2.2.2 Mock对象私有方法

@Test
public void testMockUp() {
    new MockUp<SimpleTool>(){
        //未mock函数不受影响
        @Mock
        private String fun2(String str) {
            return "(MOCK)";
        }
    };

    SimpleTool simpleTool = new SimpleTool();
    System.out.println(simpleTool.fun1("param"));
    System.out.println(simpleTool.fun3("param"));
    System.out.println(simpleTool.fun4("param"));
}

输出:

real: public String fun1(param)
real: public String fun3(param)
(MOCK)

2.2.3 Mock接口

现有接口及其实现类如下:
SimleInterface.java:

public interface SimpleInterface {
    String getCityName();
    String getAreaName();
}

SimpleInterfaceImpl.java:

public class SimpleInterfaceImpl implements SimpleInterface {
    public String getCityName() {
        return "default city";
    }
    public String getAreaName() {
        return "default area";
    }
}

实例:

//此处使用Injectable和Mocked为一样的效果
@Injectable
SimpleInterface simpleInterface;

@Test
public void testUpper() throws Exception {
    SimpleInterface mockInstance =  new MockUp<SimpleInterface>() {
        @Mock
        public String getCityName() {
            return "BEIJING(MOCK)";
        }

        @Mock
        public String getAreaName() {
            return "HUABEI(MOCK)";
        }

    }.getMockInstance();

    System.out.println(mockInstance.getCityName());
    System.out.println(mockInstance.getAreaName());
    System.out.println(simpleInterface.getCityName());
    System.out.println(simpleInterface.getAreaName());
    SimpleInterfaceImpl simpleInterfaceImpl = new SimpleInterfaceImpl();
    System.out.println(simpleInterfaceImpl.getCityName());
    System.out.println(simpleInterfaceImpl.getAreaName());
}

输出:

BEIJING(MOCK)
HUABEI(MOCK)
null
null
default city
default area

对于接口的Mock如何影响实现该接口的所有类的对象,尚需进一步研究。


转载:http://blog.csdn.net/foreverling/article/details/51234149

目录
相关文章
|
3月前
|
存储 人工智能 搜索推荐
如何打造更懂表格的智能体
察言观数 AskTable 给了回答,并非简单地将大型语言模型(LLM)直接连接到数据库,相反构建了一套严谨、可靠且高效的智能体(Agent)系统。其核心思想是:让 AI 发挥其所长,并将其置于一个可控、可验证的“笼子”里。确保数据分析准确、稳定、无幻觉。支持即时问答与深度探索,配备三层记忆系统与双重评估体系,让AI真正懂业务、可追溯、能进化。
374 155
|
Oracle Java API
虚拟线程:Java的新利器?
作者通过本文梳理了自己对虚拟线程的理解,顺便捋一捋Java线程的过去、现在和未来。ps:写这篇文章的时候,Java 19刚刚发布,而现在Java 21已经正式GA了,不过虚拟线程的API和底层实现并没有什么变化。
解决异常 java.net.URISyntaxException: Illegal character in query at index
解决异常 java.net.URISyntaxException: Illegal character in query at index
1789 0
|
存储 SQL 数据挖掘
GCP大数据分析工具:BigQuery使用指南
【7月更文挑战第15天】BigQuery作为GCP中的一项重要大数据分析工具,以其高性能、可扩展性和易用性,在数据仓库、实时数据分析、日志分析等多个领域发挥着重要作用。通过本文的介绍,读者可以了解到BigQuery的基本功能、使用场景以及配置和使用方法,为后续的数据分析和业务决策提供支持。希望读者能够充分利用BigQuery的强大能力,挖掘数据背后的价值,为企业的发展贡献力量。
1946 3
|
弹性计算 安全 API
HTTP 405 Method Not Allowed:解析与解决
本文详细解析了HTTP 405 &quot;Method Not Allowed&quot; 错误,包括其定义、常见原因、示例代码及解决方案。通过检查API文档、修改请求方法或更新服务器配置,可有效解决此错误,提升Web开发效率。
7769 2
|
存储 机器学习/深度学习 人工智能
深入浅出 AI 智能体(AI Agent)|技术干货
随着人工智能技术的发展,智能体(AI Agents)逐渐成为人与大模型交互的主要方式。智能体能执行任务、解决问题,并提供个性化服务。其关键组成部分包括规划、记忆和工具使用,使交互更加高效、自然。智能体的应用涵盖专业领域问答、资讯整理、角色扮演等场景,极大地提升了用户体验与工作效率。借助智能体开发平台,用户可以轻松打造定制化AI应用,推动AI技术在各领域的广泛应用与深度融合。
31701 1
|
Java 关系型数据库 MySQL
SonarQube——如何搭建SonarQube完整版
SonarQube——如何搭建SonarQube完整版
524 0
SonarQube——如何搭建SonarQube完整版
|
存储 分布式计算 Hadoop
Hadoop的HDFS数据均衡
【6月更文挑战第13天】
684 3
|
Linux 数据安全/隐私保护 iOS开发
从入门到精通:Python 系统编程中的跨平台兼容性攻略
【8月更文挑战第6天】在编程领域,Python 以简洁强大著称。系统编程时,确保代码能在不同平台(如 Windows、Linux 和 macOS)上良好运行至关重要。本文探讨 Python 跨平台兼容性的关键点,帮助理解各系统间的差异,例如文件路径、权限管理和进程控制的不同。通过使用 `os` 和 `subprocess` 模块,可以编写出既灵活又兼容的代码。例如,使用 `os.path.join()` 处理路径差异,`subprocess.run()` 进行进程管理。此外,还需关注环境变量和权限管理等方面的平台特性。掌握这些技巧,您将能更自信地开发跨平台的系统程序。
652 0
|
人工智能 自然语言处理 机器人
销售利器大集结:13种智能销售工具全面解析
该文探讨了人工智能在销售领域的应用,测试了13款领先工具,如Zoho CRM、Email Subject Line Generator和ChatGPT Plus等,这些工具通过数据分析、自动化任务和智能交互提升销售效率。然而,使用AI也带来人机交互和数据安全的挑战。文章强调,结合人工智能和人类销售人员的优势是关键,同时应谨慎处理相关问题。
870 4