我們仍然用ResultSet接口的 Mock 對象為例,如果希望方法mockResult.getString(1)的返回值為 "My return value",那么你可以使用以下的語句: mockResultSet.getString(1); expectLastCall().andReturn("My return value");
以上的語句表示mockResultSet的getString方法被調用一次,這次調用的返回值是 "My return value"。有時,我們希望某個方法的調用總是返回一個相同的值,為了避免每次調用都為 Mock 對象的行為進行一次設定,我們可以用設置默認返回值的方法: void andStubReturn(Object value);
假設我們創建了Statement和ResultSet接口的 Mock 對象 mockStatement 和 mockResultSet,在測試過程中,我們希望 mockStatement 對象的executeQuery方法總是返回 mockResultSet,我們可以使用如下的語句 mockStatement.executeQuery("SELECT * FROM sales_order_table"); expectLastCall().andStubReturn(mockResultSet);
EasyMock 在對參數值進行匹配時,默認采用Object.equals()方法。因此,如果我們以"select * from sales_order_table"作為參數,預期方法將不會被調用。如果您希望上例中的 SQL 語句能不區分大小寫,可以用特殊的參數匹配器來解決這個問題,我們將在 "在 EasyMock 中使用參數匹配器" 一章對此進行說明。
設定預期異常拋出
對象行為的預期輸出除了可能是返回值外,還有可能是拋出異常。IExpectationSetters提供了設定預期拋出異常的方法: IExpectationSetters<T> andThrow(Throwable throwable);
和設定默認返回值類似,IExpectationSetters接口也提供了設定拋出默認異常的函數: void andStubThrow(Throwable throwable);
設定預期方法調用次數
通過以上的函數,您可以對 Mock 對象特定行為的預期輸出進行設定。除了對預期輸出進行設定,IExpectationSetters接口還允許用戶對方法的調用次數作出限制。在IExpectationSetters所提供的這一類方法中,常用的一種是times方法: IExpectationSetters<T>times(int count);
該方法可以 Mock 對象方法的調用次數進行確切的設定。假設我們希望 mockResultSet 的getString方法在測試過程中被調用3次,期間的返回值都是 "My return value",我們可以用如下語句: mockResultSet.getString(1); expectLastCall().andReturn("My return value").times(3);
注意到andReturn和andThrow方法的返回值依然是一個IExpectationSetters實例,因此我們可以在此基礎上繼續調用times方法。
除了設定確定的調用次數,IExpectationSetters還提供了另外幾種設定非準確調用次數的方法:
times(int minTimes, int maxTimes):該方法最少被調用 minTimes 次,最多被調用 maxTimes 次。
atLeastOnce():該方法至少被調用一次。
anyTimes():該方法可以被調用任意次。
某些方法的返回值類型是 void,對于這一類方法,我們無需設定返回值,只要設置調用次數就可以了。以ResultSet接口的close方法為例,假設在測試過程中,該方法被調用3至5次: mockResultSet.close(); expectLastCall().times(3, 5);
為了簡化書寫,EasyMock 還提供了另一種設定 Mock 對象行為的語句模式。對于上例,您還可以將它寫成: expect(mockResult.close()).times(3, 5);
這個語句和上例中的語句功能是完全相同的。
將 Mock 對象切換到 Replay 狀態
在生成 Mock 對象和設定 Mock 對象行為兩個階段,Mock 對象的狀態都是 Record 。在這個階段,Mock 對象會記錄用戶對預期行為和輸出的設定。
在使用 Mock 對象進行實際的測試前,我們需要將 Mock 對象的狀態切換為 Replay。在 Replay 狀態,Mock 對象能夠根據設定對特定的方法調用作出預期的響應。將 Mock 對象切換成 Replay 狀態有兩種方式,您需要根據 Mock 對象的生成方式進行選擇。如果 Mock 對象是通過org.easymock.EasyMock類提供的靜態方法 createMock 生成的(第1節中介紹的第一種 Mock 對象生成方法),那么EasyMock類提供了相應的 replay 方法用于將 Mock 對象切換為 Replay 狀態: replay(mockResultSet);
如果 Mock 對象是通過IMocksControl接口提供的createMock方法生成的(第1節中介紹的第二種Mock對象生成方法),那么您依舊可以通過IMocksControl接口對它所創建的所有 Mock 對象進行切換: control.replay();
以上的語句能將在第1節中生成的 mockConnection、mockStatement 和 mockResultSet 等3個 Mock 對象都切換成 Replay 狀態。
文章來源于領測軟件測試網 http://www.kjueaiud.com/