標籤:
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學習筆記