JMockit簡單使用__Java提高

來源:互聯網
上載者:User
JMockit是google code上面的一個java單元測試的mock架構。


JMockit涉及到的元素介紹: @Tested和@Injectable
     對@Tested對象判斷是否為null,是則通過合適構造器初始化, @Injectable的執行個體會自動注入到@Tested中。

@Mocked
     @Mocked修飾的執行個體,將會把執行個體對應類的所有執行個體的所有行為都mock掉(無論構造方法,還是private,protected方法)。

Expectations
     錄製期望發生行為的塊,一般由Expectations類和NonStrictExpectations類定義,用Expectations類定義的,則mock對象在運行時只能按照 Expectations塊中定義的順序依次調用方法,不能多調用也不能少調用,所以可以省略掉Verifications塊;而用NonStrictExpectations類定義的,則沒有這些限制,所以如果需要驗證,則要添加Verifications塊。result和times都是其內定成員變數。result可以重定義錄製行為的傳回值甚至通過Delegate來重定義行為,times是期待錄製行為的發生次數。在Expectations中發生的調用,均會被mock。

Deencapsulation
     用於Mock私人方法和私人屬性。

簡單樣本:

package com.zero.jmockit;public class Utils {private static String URL_STRING = "http://www.sina.com.cn";private static void deal() {System.out.println("deal() " + URL_STRING);}public static String getObject(JMockitObject object, String str) {deal();System.out.println("getObject() ");return URL_STRING + str;}}
package com.zero.jmockit;public class UserService {public String getUserName(int id) {return "hello";}}
package com.zero.jmockit;import javax.annotation.Resource;public class JMockitObject {@Resourceprivate UserService userService;public void dealUser() {String name = userService.getUserName(1);System.out.println("userService.getUserName() : " + name);sys(name);}private void sys(String name) {System.out.println("sys() : " + name);}public String getString() {getObject(this, "/zero");return Utils.getObject(this, "/zero");}private void getObject(JMockitObject object, String str) { System.out.println("--------");}}
package com.zero.jmockit;import org.junit.*;import org.junit.runner.RunWith;import mockit.*;import mockit.integration.junit4.JMockit;@RunWith(JMockit.class)public final class JMockitTest {@Tested@Mockedprivate JMockitObject jMockitObject;@Injectableprivate UserService userService;@Testpublic void testDealUser() {new NonStrictExpectations() {// 錄製預期類比行為{userService.getUserName(anyInt);//mock public方法result = "zero";// 也可以使returns("zero");times = 1;Deencapsulation.invoke(jMockitObject, "sys", anyString);//mock private方法// sys()無傳回值,沒定義result,則調用的結果返回空,故result = null; 可寫可不寫result = null;}};jMockitObject.dealUser();//回放}@Testpublic void testSys() {Deencapsulation.invoke(jMockitObject, "sys", "Hello World!");//測試private方法}@Testpublic void testStaticField() {// mock 靜態私人屬性new NonStrictExpectations(Utils.class) {{Deencapsulation.setField(Utils.class, "URL_STRING","www.baidu.com");}};// 第二種方式:// new MockUp<Utils>() {// {// // 修改靜態私人屬性// Deencapsulation.setField(Utils.class, "URL_STRING",// "www.baidu.com");// }// };String str = Deencapsulation.getField(Utils.class, "URL_STRING");Assert.assertEquals("www.baidu.com", str);}@Testpublic void testStaticFunction() {// mock 靜態私人方法new MockUp<Utils>() {@Mockprivate void deal() {// 注意在MockUp中的方法除了不包含static關鍵字以外,其他都和被Mock的方法簽名相同,並且使用@Mock標註System.out.println("mock deal() ");}};Deencapsulation.invoke(Utils.class, "deal");}@Testpublic void testGetString() {new NonStrictExpectations() {{Deencapsulation.invoke(jMockitObject, "getObject",withAny(JMockitObject.class), withAny(String.class));// 不能使用any這樣的參數,否則必須使用正確類型的參數;// withAny(JMockitObject.class), anyString); 可以}};new NonStrictExpectations(Utils.class) {{Utils.getObject((JMockitObject) any, anyString);returns("zero");}};Assert.assertEquals("zero", jMockitObject.getString());}}



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.