JMockit学习笔记

简介: 1 基本概念1.1 常用注解@Mocked:被修饰的对象将会被Mock,对应的类和实例都会受影响(同一个测试用例中)@Injectable:仅Mock被修饰的对象@Capturing:可以mock接口以及其所有的实现类@Mock:MockUp模式中,指定被Fake的方法1.2 常用的类Expectations:期望,指定的方法必须被调用Stri

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);
    }
}
AI 代码解读

UseSimpleTool.java:

public class UseSimpleTool {
    public String fun1(String name) {
        SimpleTool simpleTool = new SimpleTool();
        return simpleTool.fun1(name);
    }
}
AI 代码解读

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;
       }
    };
}
AI 代码解读

输出:

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;
        }
    };
}
AI 代码解读

输出:

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;
        }
    };
}
AI 代码解读

输出:

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"));
}
AI 代码解读

输出:

(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"));
}
AI 代码解读

输出:

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

2.2.3 Mock接口

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

public interface SimpleInterface {
    String getCityName();
    String getAreaName();
}
AI 代码解读

SimpleInterfaceImpl.java:

public class SimpleInterfaceImpl implements SimpleInterface {
    public String getCityName() {
        return "default city";
    }
    public String getAreaName() {
        return "default area";
    }
}
AI 代码解读

实例:

//此处使用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());
}
AI 代码解读

输出:

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

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

目录
相关文章
云产品评测|云安全这道坎,企业该怎么迈?阿里云「安全体检」实测报告
随着云计算的普及,云安全问题日益突出。阿里云提供的免费“安全体检”工具,能够自动化检测系统漏洞、风险配置和病毒攻击,帮助用户及时发现并修复潜在的安全隐患。通过实际测试,该工具在基础漏洞检测方面表现出色,但对于高级攻击(如文件上传攻击)的识别能力有限,且免费版功能相对简单。对于中小企业和个人用户而言,这一工具极具价值,能够显著提升云上资产的安全性。然而,对于安全要求极高的企业,建议结合其他专业安全服务使用,以确保全面防护。 总结:阿里云“安全体检”适合入门级用户快速提升安全性,但并非万能解决方案。
《阿里云安全白皮书2024版》发布:国内首推“安全共同体”理念
9月20日,在杭州云栖大会上,阿里云发布2024版《阿里云安全白皮书》,正式将公共云安全责任共担的思路,升级为“云上安全共同体”理念,这意味着阿里云不仅会坚守安全责任共担模式下云服务商的责任,搭建和提供“安全的云”, 更会进一步与客户紧密合作,提供更多可供客户采取的安全保障措施,与云上客户共同形成一个紧密相连、 互相支持的安全防护网络,进一步造就云平台的运行安全。
294 15
键值对魔法:如何优雅地使用Java Map,让代码更简洁?
【6月更文挑战第18天】在Java中,高效使用Map能提升代码质量。例如,Java 9引入了简洁的初始化语法`Map.of()`来创建Map。Stream API允许优雅地处理Map,如遍历、筛选和转换数据。Map的方法如`merge`用于合并键值,`computeIfAbsent`和`computeIfPresent`则在条件满足时计算并更新值。此外,Map的默认方法如`getOrDefault`提供便利。掌握这些特性可使Map操作更高效和易读。
489 57
PolarDB产品使用问题之是否支持分库分表创建数据库
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
java.lang.RuntimeException: Can‘t start redis server. Check logs for details.
java.lang.RuntimeException: Can‘t start redis server. Check logs for details.
171 1
jts里的lineString.getLength()的单位是什么如何换算成距离
【6月更文挑战第7天】jts里的lineString.getLength()的单位是什么如何换算成距离
607 0
Idea Mybatis插件:提高CRUD效率
将mybatis xml转成真实SQL语句、参数mock、SQL规范检查、SQL索引检查、SQL运行、SQL压测及Mybatis SQL语句扫描
1128 1
Idea Mybatis插件:提高CRUD效率
网络安全-webshell详解(原理、检测与防御)
网络安全-webshell详解(原理、检测与防御)
1265 1
解析yaml文件(YamlPropertiesFactoryBean、YamlMapFactoryBean)
解析yaml文件(YamlPropertiesFactoryBean、YamlMapFactoryBean)
340 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等