【JUnit】EasyMock用法總結
阿新 • • 發佈:2019-02-12
使用EasyMock的總體步驟
1、生成Mock介面
IService mockService = EasyMock.createMock("name", IService.class);
如果要mock物件,而不是介面,應該使用class extension:org.easymock.classextension.EasyMock
如果要mock多個介面,最好使用MockControl來管理:
IMocksControl control = EasyMock.createControl(); IService1 mockObj1 = control.createMock(IService1.class); IService2 mockObj2 = control.createMock(Iservice2.class);
2、設定預期行為
如果返回值是void:
mockService.doVoidMethod();
EasyMock.expectLastCall();// 最新版本的EasyMock可以忽略此句
如果要求丟擲異常:
EasyMock.expectLastCall().andThrow(
new MyException(new RuntimeException())).anyTimes();
如果返回值不是void:
EasyMock.expect(mockService.doSomething(isA(Long.class), isA(Report.class), isNull(Report.class))).andReturn("return string").anyTimes();
上例方法中傳入3個引數,分別是Long、Report、null——注意,如果引數是基本型別long,則使用EasyMock.anyLong()
傳入引數還可以定義為具體的物件,而不是類。
3、將Mock物件切換到replay狀態
EasyMock.replay(mockService);
如果是用MockControl來管理:control.replay();
4、測試
bo.setService(mockService);
bo.doSomething();
5、驗證Mock物件的行為
EasyMock.verify(mockService);
如果是用MockControl來管理:control.verify();
expect()注意事項
期望傳入引數為基本型別時
用expect來設定mock方法的期望呼叫方式時,如果使用到基本型別,但是又不要基本型別的值,
不能用:EasyMock.isA(Long.class)
要用:EasyMock.anyLong()
期望傳入引數可能為null時
如果傳入的引數可能為null,如果用
isA(String.class)
而實際傳入的是null,則會報錯 (isA(java.lang.String), <any>): expected: 1, actual: 0應該用:
or(isA(String.class), isNull())
如果返回結果在執行時才能確定
很可能某個方法期望的返回結果不是固定的,例如根據傳入引數不同而不同;這時需要使用andAnswer():
EasyMock.expect(mockService.execute(EasyMock.anyInt())).andAnswer(new IAnswer<Integer>() {
public Integer answer() throws Throwable {
Integer count = (Integer) EasyMock.getCurrentArguments()[0];
return count * 2;
}
});
注意,通過EasyMock.getCurrentArguments()可以獲取傳入引數!
times()
常見問題
java.lang.IllegalStateException: 2 matchers expected, 1 recorded.
可能是設定mock方法的期望呼叫方式時,既使用了isA的方式來指定引數,又使用了一個具體值來作為引數
比如這樣寫:
expect(mockEmployeeRepository.findByDepartmentAndSpecification("HR",
isA(EmployeeSearchSpecification.class)).andReturn(emplooyees);
正確的寫法:——用eq(具體值)
expect(mockEmployeeRepository.findByDepartmentAndSpecification(eq("HR"),
isA(EmployeeSearchSpecification.class)).andReturn(employees);