jmockit中文网 expectations 入门

通过上面的例子,我们已经了解了Expectations的作用主要是用于录制。即录制类/对象的调用,返回值是什么。

录制脚本规范


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

new Expectations() {

    // 这是一个Expectations匿名内部类

    {

          // 这是这个内部类的初始化代码块,我们在这里写录制脚本,脚本的格式要遵循下面的约定

        //方法调用(可是类的静态方法调用,也可以是对象的非静态方法调用)

        //result赋值要紧跟在方法调用后面

        //...其它准备录制脚本的代码

        //方法调用

        //result赋值

    }

};

还可以再写new一个Expectations,只要出现在重放阶段之前均有效。

new Expectations() {

     

    {

         //...录制脚本

    }

};

Expectations主要有两种使用方式。

    1. 通过引用外部类的Mock对象(@Injectabe,@Mocked,@Capturing)来录制

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

//Expectations对外部类的mock对象进行录制

public class ExpectationsTest {

    @Mocked

    Calendar cal;

    @Test

    public void testRecordOutside() {

        new Expectations() {

            {

                // 对cal.get方法进行录制,并匹配参数 Calendar.YEAR

                cal.get(Calendar.YEAR);

                result = 2016;// 年份不再返回当前小时。而是返回2016年

                // 对cal.get方法进行录制,并匹配参数 Calendar.HOUR_OF_DAY

                cal.get(Calendar.HOUR_OF_DAY);

                result = 7;// 小时不再返回当前小时。而是返回早上7点钟

            }

        };

        Assert.assertTrue(cal.get(Calendar.YEAR) == 2016);

        Assert.assertTrue(cal.get(Calendar.HOUR_OF_DAY) == 7);

        // 因为没有录制过,所以这里月份返回默认值 0

        Assert.assertTrue(cal.get(Calendar.DAY_OF_MONTH) == 0);

    }

}

在这个例子中,在Expectations匿名内部类的初始代码块中,我们可以对外部类的任意成员变量,方法进行调用。大大便利我们书写录制脚本。

  1. 通过构建函数注入类/对象来录制

    在上面的例子中,我们通过引用外部类的Mock对象(@Injectabe,@Mocked,@Capturing)来录制,可是无论是@Injectabe,@Mocked,@Capturing哪种Mock对象,都是对类的方法都mock了,可是有时候,我们只希望JMockit只mock类/对象的某一个方法。怎么办? 看下面的例子就明白啦。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

//通过Expectations对其构造函数mock对象进行录制

public class ExpectationsConstructorTest2 {

    // 把类传入Expectations的构造函数

    @Test

    public void testRecordConstrutctor1() {

        Calendar cal = Calendar.getInstance();

        // 把待Mock的类传入Expectations的构造函数,可以达到只mock类的部分行为的目的

        new Expectations(Calendar.class) {

            {

                // 只对get方法并且参数为Calendar.HOUR_OF_DAY进行录制

                cal.get(Calendar.HOUR_OF_DAY);

                result = 7;// 小时永远返回早上7点钟

            }

        };

        Calendar now = Calendar.getInstance();

        // 因为下面的调用mock过了,小时永远返回7点钟了

        Assert.assertTrue(now.get(Calendar.HOUR_OF_DAY) == 7);

        // 因为下面的调用没有mock过,所以方法的行为不受mock影响,

        Assert.assertTrue(now.get(Calendar.DAY_OF_MONTH) == (new Date()).getDate());

    }

    // 把对象传入Expectations的构造函数

    @Test

    public void testRecordConstrutctor2() {

        Calendar cal = Calendar.getInstance();

        // 把待Mock的对象传入Expectations的构造函数,可以达到只mock类的部分行为的目的,但只对这个对象影响

        new Expectations(cal) {

            {

                // 只对get方法并且参数为Calendar.HOUR_OF_DAY进行录制

                cal.get(Calendar.HOUR_OF_DAY);

                result = 7;// 小时永远返回早上7点钟

            }

        };

        // 因为下面的调用mock过了,小时永远返回7点钟了

        Assert.assertTrue(cal.get(Calendar.HOUR_OF_DAY) == 7);

        // 因为下面的调用没有mock过,所以方法的行为不受mock影响,

        Assert.assertTrue(cal.get(Calendar.DAY_OF_MONTH) == (new Date()).getDate());

        // now是另一个对象,上面录制只对cal对象的影响,所以now的方法行为没有任何变化

        Calendar now = Calendar.getInstance();

        // 不受mock影响

        Assert.assertTrue(now.get(Calendar.HOUR_OF_DAY) == (new Date()).getHours());

        // 不受mock影响

        Assert.assertTrue(now.get(Calendar.DAY_OF_MONTH) == (new Date()).getDate());

    }

}

原文地址:https://www.cnblogs.com/funkboy/p/12012541.html

时间: 2024-11-10 07:51:55

jmockit中文网 expectations 入门的相关文章

jmockit中文网 dubbo bean

Dubbo是我们常用的RPC框架,在写单元测试需要调用Dubbo消费Bean时,如何模拟Dubbo消费Bean的行为呢? 就拿发邮件来说,通常,在代码中,我们是调用邮件的Dubbo服务来完成发送邮件的目的,于是我们会在Spring配置好的发邮件的Dubbo消费Bean,dubbo-consumer.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?xml version="1.0" encoding="utf-8"?>

jmockit中文网备份 @Mocked入门

当@Mocked修饰一个类时 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19  //@Mocked注解用途 public class MockedClassTest {     // 加上了JMockit的API @Mocked, JMockit会帮我们实例化这个对象,不用担心它为null     @Mocked     Locale locale;     // 当@Mocked作用于class     @Test     public void

jMockit中文网备份 @Test&amp;@Injectable

@Injectable 与 @Mocked的不同 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 //@Mocked与@Injectable的不同 public class MockedAndInjectable {     @Test     public void testMocked(@Mocked Locale locale) {         // 静态方法不起作用了,返回了null         

jmockit 中文网 springbean

如今,我们的很多应用程序是基于Spring的,通过Spring IOC容器来管理我们的Java对象.所以这里单独提出对Spring Bean如何Mock方法. 以上述提到如何Mock类中的提到的AnOrdinaryClass为例,先把这个类配置在Spring的配置文件中 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <?xml version="1.0" encoding="utf-8"?> <!--su

jmockit中文网 定制结果

在学习Expectations(API:Expectations)时   ,在new Expectations{{}}代码中,返回的结果都比较简单.就是一个单一的对象.可是有时,这个返回的结果,可能是需要经历一些业务逻辑计算后,才知道返回什么的,此时,我们就需要定制返回结果了. 还是上例子吧. 还是以上文打招呼的例子来说. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

jmockit中文网 aop设置

在学习MockUp(API:MockUp)时, MockUp可以自定义方法体,覆盖类原有的方法. JMockit给我们提供了一个特别的方法,用于拦截所有方法,可以让我们在基于被Mock的方法做AOP. 比如我们想测试每个方法的时间性能. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 //通过在mock时做AOP测试方法的时间性能 public c

jmockit 中文网 构造函数中文代码块

有时候,有些编写不良好的类的构造函数,初始代码块,静态代码块存在大量的初始化逻辑,初始化会报错. 比如,有些类初始化的时候就去连结DB,连不上就报错.这很影响我们的测试程序的运行. 此时,我们需要把这些初始化逻辑Mock掉.用我们的Mock逻辑替代.要Mock这些初始化代码,很简单.见如下的例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 //一个包含初始代码块的普通类  publi

jmockit 中文网 mq消息生产者

RocketMQ是我们常用的消息中间件,在运行单元测试时,我们可能不需要真正发送消息(除非是为了测试发送消息),也不想因为连结不上RocketMQ的Broker,NameServer而影响单元测试运行.   那我们该如何Mock RocketMQ消息生产者呢?  请看例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 //RocketMQ消息生产者 Mock  public class RocetMQProduce

SpringCloud 入门理论知识

SpringCloud 入门问题 微服务概念 微服务之间如何通信 SpringCloud与Dubbo的区别 SpringBoot与SpringCloud的关系 服务熔断和服务降级概念 微服务的优缺点 微服务技术栈 eureka和zookeeper的区别 微服务概述 微服务起源:微服务 微服务将单一应用程序划分为一组小服务,每个服务独立在及自己的进程中,通过Restful方式互相沟通.调用.每个服务提供单个业务功能,去耦合. 微服务与微服务架构 微服务:指系统中的一个服务应用. 微服务架构:架构风