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