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"?>

<!--suppress ALL -->

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"

    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"

    xmlns:p="http://www.springframework.org/schema/p"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

        http://www.springframework.org/schema/context

        http://www.springframework.org/schema/context/spring-context-2.5.xsd

        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd

        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"

    default-autowire="byName">

   <!-- 1个普通的spring bean-->

    <bean id="anOrdinaryBean" class="cn.jmockit.demos.AnOrdinaryClass" /> 

</beans>

同样地,讲述2种Mock方法

    1. 用Expectations来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

//用Expectations来Mock Spring Bean

@ContextConfiguration(locations = { "/META-INF/applicationContext1.xml" })

@RunWith(SpringJUnit4ClassRunner.class)

public class SpringBeanMockingByExpectationsTest {

    // 注入Spring Bean,Mock这个实例,就达到了Mock Spring Bean的目的

    @Resource

    AnOrdinaryClass anOrdinaryBean;

    @Test

    public void testSpringBeanMockingByExpectation() {

        // 直接把实例传给Expectations的构造函数即可Mock这个实例

        new Expectations(anOrdinaryBean) {

            {

                // 尽管这里也可以Mock静态方法,但不推荐在这里写。静态方法的Mock应该是针对类的

                // mock普通方法

                anOrdinaryBean.ordinaryMethod();

                result = 20;

                // mock final方法

                anOrdinaryBean.finalMethod();

                result = 30;

                // native, private方法无法用Expectations来Mock

            }

        };

        Assert.assertTrue(AnOrdinaryClass.staticMethod() == 1);

        Assert.assertTrue(anOrdinaryBean.ordinaryMethod() == 20);

        Assert.assertTrue(anOrdinaryBean.finalMethod() == 30);

        // 用Expectations无法mock native方法

        Assert.assertTrue(anOrdinaryBean.navtiveMethod() == 4);

        // 用Expectations无法mock private方法

        Assert.assertTrue(anOrdinaryBean.callPrivateMethod() == 5);

    }

    @BeforeClass

    // 加载AnOrdinaryClass类的native方法的native实现    

    public static void loadNative() throws Throwable {    

        JNITools.loadNative();    

    }    

}

  1. 用MockUp来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

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

//用MockUp来Mock Spring Bean

@ContextConfiguration(locations = { "/META-INF/applicationContext1.xml" })

@RunWith(SpringJUnit4ClassRunner.class)

public class SpringBeanMockingByMockUpTest {

    // 注入Spring Bean,Mock这个实例,就达到了Mock Spring Bean的目的

    @Resource

    AnOrdinaryClass anOrdinaryBean;

    @Test

    public void testSpringBeanMockingByMockUp() {

        // 静态方法被mock了

        Assert.assertTrue(AnOrdinaryClass.staticMethod() == 10);

        // 普通方法被mock了

        Assert.assertTrue(anOrdinaryBean.ordinaryMethod() == 20);

        // final方法被mock了

        Assert.assertTrue(anOrdinaryBean.finalMethod() == 30);

        // native方法被mock了

        Assert.assertTrue(anOrdinaryBean.navtiveMethod() == 40);

        // private方法被mock了

        Assert.assertTrue(anOrdinaryBean.callPrivateMethod() == 50);

    }

    @BeforeClass

    public static void beforeClassMethods() throws Throwable {

        loadNative();

        // 必须在Spring容器初始化前,就对Spring Bean的类做MockUp

        addMockUps();

    }

        

    // 加载AnOrdinaryClass类的native方法的native实现    

    public static void loadNative() throws Throwable {    

        JNITools.loadNative();    

    }    

    // 对AnOrdinaryClass的Class

    public static class AnOrdinaryClassMockUp extends MockUp<AnOrdinaryClass> {

        // Mock静态方法

        @Mock

        public static int staticMethod() {

            return 10;

        }

        // Mock普通方法

        @Mock

        public int ordinaryMethod() {

            return 20;

        }

        @Mock

        // Mock final方法

        public final int finalMethod() {

            return 30;

        }

        // Mock native方法

        @Mock

        public int navtiveMethod() {

            return 40;

        }

        // Mock private方法

        @Mock

        private int privateMethod() {

            return 50;

        }

    }

    // 添加MockUp

    public static void addMockUps() {

        new AnOrdinaryClassMockUp();

    }

}

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

时间: 2024-11-01 11:29:01

jmockit 中文网 springbean的相关文章

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中文网 expectations 入门

通过上面的例子,我们已经了解了Expectations的作用主要是用于录制.即录制类/对象的调用,返回值是什么. 录制脚本规范 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 new Expectations() {     // 这是一个Expectations匿名内部类     {           // 这是这个内部类的初始化代码块,我们在这里写录制脚本,脚本的格式要遵循下面的约定         //方法调用(可是类的静态方法调用,也可以

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中文网 定制结果

在学习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 中文网 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

常用书签

<!DOCTYPE NETSCAPE-Bookmark-file-1><!-- This is an automatically generated file. It will be read and overwritten. DO NOT EDIT! --><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"><TITLE>Bookmar