1. 程式人生 > >【JUnit】EasyMock用法總結

【JUnit】EasyMock用法總結

使用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);