JMockit學習筆記

來源:互聯網
上載者:User

標籤:

1 基本概念1.1 常用註解
  • @Mocked:被修飾的對象將會被Mock,對應的類和執行個體都會受影響(同一個測試案例中)
  • @Injectable:僅Mock被修飾的對象
  • @Capturing:可以mock介面以及其所有的實作類別
  • @Mock:MockUp模式中,指定被Fake的方法
1.2 常用的類
  • Expectations:期望,指定的方法必須被調用
  • StrictExpectations:嚴格的期望,指定方法必須按照順序調用
  • NonStrictExpectations:非嚴格的期望,是否調用和順序不作要求
  • Verifications:驗證,一般配合NonStrictExpectations來使用
  • Invocation:工具類,可以擷取調用資訊
  • Delegate:自己指定傳回值,適合那種需要參數決定傳回值的情境,只需指定匿名子類就可以。
  • MockUp:類比函數實現
  • Deencapsulation:反射工具類
2 使用執行個體

現有兩個類如下:
SimpleTool.java:

public class SimpleTool {    public String fun1(String str) {        return "real: public String fun1(" + str + ")";    }    private String fun2(String str) {        return "real: private String fun2(" + str + ")";    }    public String fun3(String str) {        return "real: public String fun3(" + str + ")";    }    public String fun4(String str) {        return fun2(str);    }}

UseSimpleTool.java:

public class UseSimpleTool {    public String fun1(String name) {        SimpleTool simpleTool = new SimpleTool();        return simpleTool.fun1(name);    }}
2.1 Status-based2.1.1 執行個體1:Mocked
@MockedSimpleTool simpleTool;@Testpublic void testExpectation() {    //未mock函數返回null    new Expectations() {        {            simpleTool.fun1(anyString);            result = "MOCK";        }    };    System.out.println(simpleTool.fun1("param"));    System.out.println(simpleTool.fun3("param"));    System.out.println(new UseSimpleTool().fun1("param"));    new Verifications() {       {           simpleTool.fun1(anyString);           times = 2;       }    };}

輸出:

MOCK
null
MOCK

2.1.2 執行個體2:Injectable
@InjectableSimpleTool simpleTool;@Testpublic void testExpectation() {    //未mock函數返回null    new Expectations() {        {            simpleTool.fun1(anyString);            result = "MOCK";        }    };    System.out.println(simpleTool.fun1("param"));    System.out.println(simpleTool.fun3("param"));    System.out.println(new UseSimpleTool().fun1("param"));    new Verifications() {        {            simpleTool.fun1(anyString);            times = 1;        }    };}

輸出:

MOCK
null
real: public String fun1(param)

2.1.3 結果可變Delegate
@MockedSimpleTool simpleTool;@Testpublic void testExpectation() {    new Expectations() {        {            simpleTool.fun1(anyString);            result = new Delegate<String>() {                public String aDelegateMethod(String str) {                    return str.equals("param0") ? "MOCK0" : "MOCK1";                }            };        }    };    System.out.println(simpleTool.fun1("param0"));    System.out.println(simpleTool.fun3("param"));    System.out.println(new UseSimpleTool().fun1("param1"));    new Verifications() {        {            simpleTool.fun1(anyString);            times = 2;        }    };}

輸出:

MOCK0
null
MOCK1

2.2 Behavior-based2.2.1 Mock對象公有方法
@Testpublic void testMockUp() {    //影響該類所有執行個體    new MockUp<SimpleTool>(){        //未mock函數不受影響        @Mock        public String fun1(String str) {            return "(MOCK)";        }    };    SimpleTool simpleTool = new SimpleTool();    System.out.println(simpleTool.fun1("param"));    System.out.println(simpleTool.fun3("param"));    UseSimpleTool useSimpleTool = new UseSimpleTool();    System.out.println(useSimpleTool.fun1("param"));}

輸出:

(MOCK)
real: public String fun3(param)
(MOCK)

2.2.2 Mock對象私人方法
@Testpublic void testMockUp() {    new MockUp<SimpleTool>(){        //未mock函數不受影響        @Mock        public String fun2(String str) {            return "(MOCK)";        }    };    SimpleTool simpleTool = new SimpleTool();    System.out.println(simpleTool.fun1("param"));    System.out.println(simpleTool.fun3("param"));    System.out.println(simpleTool.fun4("param"));}

輸出:

real: public String fun1(param)
real: public String fun3(param)
(MOCK)

2.2.3 Mock介面

現有介面及其實作類別如下:
SimleInterface.java:

public interface SimpleInterface {    String getCityName();    String getAreaName();}

SimpleInterfaceImpl.java:

public class SimpleInterfaceImpl implements SimpleInterface {    public String getCityName() {        return "default city";    }    public String getAreaName() {        return "default area";    }}

執行個體:

//此處使用Injectable和Mocked為一樣的效果@InjectableSimpleInterface simpleInterface;@Testpublic void testUpper() throws Exception {    SimpleInterface mockInstance =  new MockUp<SimpleInterface>() {        @Mock        public String getCityName() {            return "BEIJING(MOCK)";        }        @Mock        public String getAreaName() {            return "HUABEI(MOCK)";        }    }.getMockInstance();    System.out.println(mockInstance.getCityName());    System.out.println(mockInstance.getAreaName());    System.out.println(simpleInterface.getCityName());    System.out.println(simpleInterface.getAreaName());    SimpleInterfaceImpl simpleInterfaceImpl = new SimpleInterfaceImpl();    System.out.println(simpleInterfaceImpl.getCityName());    System.out.println(simpleInterfaceImpl.getAreaName());}

輸出:

BEIJING(MOCK)
HUABEI(MOCK)
null
null
default city
default area

對於介面的Mock如何影響實現該介面的所有類的對象,尚需進一步研究。

JMockit學習筆記

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.