EasyMockの使用方法と原理の剖析
EasyMockは、指定されたインタフェースに基づいてMockオブジェクトを動的に構築する方法を提供し、手動でMockオブジェクトを記述することを回避します.
MockオブジェクトとEasyMockの概要
ユニットテストは、アプリケーションのモジュールの機能を検証します.ユニットテストでは、アプリケーション内の他の協同モジュールがまだ開発されていないか、テストされたモジュールが構築しにくい複雑なオブジェクトと対話する必要があるという問題がよくあります.また,他のモジュールの正確性を肯定できないため,テストで発見された問題がどのモジュールに起因しているかを判断することもできない.
Mockオブジェクトは、他の協同モジュールの動作をシミュレートすることができ、被試験モジュールは、Mockオブジェクトと協働することによって、孤立した試験環境を得ることができる.さらに、Mockオブジェクトを使用すると、HttpServletRequestがServletコンテナで構築される必要があるなど、アプリケーションで容易に構築できないオブジェクトや、JDBCのResultSetオブジェクトなどの複雑なオブジェクトをシミュレートして、テストをスムーズに行うことができます.
1.easymockを導入する.jar
2.easymockを使用してmockオブジェクトを生成する
指定されたインタフェースまたはクラスによって、EasyMockは動的にMockオブジェクトを作成することができます(EasyMockのデフォルトではインタフェースのMockオブジェクトの生成のみがサポートされていますが、クラスのMockオブジェクトを生成する必要がある場合は、EasyMockのホームページに拡張パッケージがあり、この機能を実現できます).ResultSetインタフェースを例にEasyMockの機能を説明します.java.sql.ResultSetはJava開発者一人一人がよく知っているインタフェースです.
public interface java.sql.ResultSet {
......
public abstract java.lang.String getString(int arg0) throws java.sql.SQLException;
public abstract double getDouble(int arg0) throws java.sql.SQLException;
......
}
, RecordSet : , DBUtility Connection, Connection Statement。 Statement ResultSet 。 。 , 。
EasyMock ResultSet Mock 。 Mock , , Mock :
ResultSet mockResultSet = createMock(ResultSet.class);
createMock org.easymock.EasyMock , static import 。
mock ,EasyMock Mock :
IMocksControl control = EasyMock.createControl();
java.sql.Connection mockConnection = control.createMock(Connection.class);
java.sql.Statement mockStatement = control.createMock(Statement.class);
java.sql.ResultSet mockResultSet = control.createMock(ResultSet.class);
EasyMock createControl IMockControl , Mock 。 Mock , , Mock 。
, EasyMock Class Extension。 , org.easymock.classextension.EasyMock org.easymock.EasyMock 。
3.Mockオブジェクトの と を する
, Mock :Record Replay 。Mock , Record。 Record , Mock , , Mock 。
Mock Mock 。 Mock IExpectationSetters 。Mock :(1) (2) 。
IExpectationSetter , andReturn :
IExpectationSetters andReturn(T value);
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() 。 。
IExpectationSetter :
IExpectationSetters andThrow(Throwable throwable);
,IExpectationSetters
void andStubThrow(Throwable throwable);
IExpectationSetters 。 IExpectationSetters , times :
IExpectationSetterstimes(int count);
mockResultSet getString 3 , “My result 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(): 。
,EasyMock Mock 。
expect(mockResult.close()).times(3, 5);
Mockオブジェクトをプレイ に り える
Mock , Mock Replay。 Replay ,Mock 。 Mock Replay , Mock 。 Mock org.easymock.EasyMock createMock
replay(mockResultSet);
Mock IMocksControl createMock
control.replay();
Mockオブジェクトの の
Mock , Mock 。 replay , Mock 。
verify(mockResultSet);
control.verify();
Mockオブジェクトの
Mock , reset ,EasyMock reset , ,Mock Record 。
パラメータマッチング
EasyMock パラメータ
(1)anyObject , anyObject ,EasyMock 。
(2)aryEq(X value): Arrays.equals() , 。
(3)isNull(): Null 。
(4)notNull(): Null 。
(5)same(X value):
(6)lt(X value),leq(X value),geq(X value),gt(X value): 、 、 、 ,
(7)startsWit(String prefix),contains(String substring),endsWith(String suffix): 、 , , String 。
(8)matches(String regex): , String 。
カスタムパラメータマッチング
, org.easymock.IArgumentMatcher 。 matches(Object actual) , appendTo(StringBuffer buffer) , 。
なMockオブジェクトタイプ
Strick Mockオブジェクト
Mock (Strick Mock), EasyMock.createStrickMock() 。
ResultSet strickMockResultSet = createStrickMock(ResultSet.class);
IMocksControl control = EasyMock.createStrictControl();
ResultSet strickMockResultSet = control.createMock(ResultSet.class);
Nice Mockオブジェクト
createMock() Mock AssertionError, 0,null false Nice Mock 。
EasyMockの
,EasyMock java.lang.reflect.Proxy , , Mock 。
:https://www.ibm.com/developerworks/cn/opensource/os-cn-easymock/
:1024s