JMockit 與spring的mock操作


from Jmockit 中文網  http://jmockit.cn/showArticle.htm?channel=3&id=13

如今,我們的很多應用程序是基於Spring的,通過Spring IOC容器來管理我們的Java對象。所以這里單獨提出對Spring Bean如何Mock方法。

以上述提到如何Mock類中的提到的AnOrdinaryClass為例,先把這個類配置在Spring的配置文件中

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

    //用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();    
        }    
    }

    2.用MockUp來Mock

    //用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();
        }
    }

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM