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);
    }
}

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如何影响实现该接口的所有类的对象,尚需进一步研究。

目录
相关文章
|
XML Java 数据格式
SpringBoot源码分析系列之五:再探自动装配原理
我们从程序运行的角度把自动配置的主要的源码进行了分析,过滤了一些步骤,主要是调用层级太多容易让人抓不住重点,这边也是给大家看源码的一点小技巧就是抓大放小,抓住主要流程,忽略掉小的细节部分,否则我们就会陷入到源码的汪洋之中无法自拔。
SpringBoot源码分析系列之五:再探自动装配原理
|
6月前
|
消息中间件 Java Kafka
SpringBoot中的@Bean之谜:揭秘依赖注入的魔法与陷阱
【8月更文挑战第29天】这段内容介绍了在分布式系统中起到异步通信与解耦作用的消息队列,并详细探讨了三种流行的消息队列产品:RabbitMQ、RocketMQ 和 Kafka。RabbitMQ 是一个基于 AMQP 协议的开源消息队列系统,支持多种消息模型,具有高可靠性及稳定性;RocketMQ 则是由阿里巴巴开源的高性能分布式消息队列,支持事务消息等多种特性;而 Kafka 是 LinkedIn 开源的分布式流处理平台,以其高吞吐量和良好的可扩展性著称。文中还提供了使用这三种消息队列产品的示例代码。
35 0
|
Java 应用服务中间件 程序员
Spring源码之六-onRefresh()方法
今天带大家解读Spirng源码之六的onRefresh()方法,这是refresh()的其中的一个方法,看似是一个空方法,实则他是非常非常重要的,对于提高Spring的扩展性。
|
9月前
|
XML Java 数据格式
SpringIOC精讲
SpringIOC精讲
39 0
|
XML Java 数据库连接
你一定能看懂的 SpringBoot 自动装配原理
你一定能看懂的 SpringBoot 自动装配原理
1133 0
你一定能看懂的 SpringBoot 自动装配原理
小白救星-SpringBoot最简教程04: lombok技术
当一个类的字段特别多时,整个文件看起来将非常不简洁。所幸IDEA提供了一款lombok插件,可以在代码阶段,通过添加注解的形式,省去手写getter, setter的麻烦。
|
XML 人工智能 Java
从0到1学习Spring框架3
从0到1学习Spring框架
|
设计模式 前端开发 Java
从0到1学习Spring框架1
从0到1学习Spring框架
|
XML Java 关系型数据库
从0到1学习Spring框架2
从0到1学习Spring框架

热门文章

最新文章