スタブを作成する必要がある巨大なクラスがあります。
イメージを与えるために、それは GWT の Messages クラスです。多くの場合、これは文字列を返す多数のメソッドを持つクラスです。
JMock ではスタブを実行できますが、各メソッドを許可することで終わります...これは私が見たいものではありません。
各メソッドのスタブを自動的に構築するものはありますか? 空の文字列などの事前定義されたものを返すには、このメソッドが必要ですが、提案があれば満足します。
あなたが答えを見つけたことを嬉しく思います。詳細については、jMock ではメソッドの一致方法を非常に柔軟に指定できます。 http://www.jmock.org/match-object-or-method.htmlを参照してください。たとえば、次のようなことができます。
allowing (any(Object.class)).method("get.*").withNoArguments();
任意のゲッターに一致します。
S
JMock では、関心のあるメソッドを明示的な結果で許可してから、メソッドを含まない許可ステートメントでメッセージ オブジェクトの他のメソッドを許可できます。例えば:
allowing(m).getBlah("something");
will(returnValue("foo"));
allowing(m); // matches anything else, will return some default value if called
しかし...
たくさんの getter メソッドをスタブ化するだけなら、モック オブジェクト フレームワークは使用すべきツールではありません。モック オブジェクトは、テスト対象のオブジェクトが正しいコマンドを隣接するオブジェクトに送信して、その環境を変更することをテストするために使用されます。
ゲッターのみを含むインターフェイスの場合、スタブ クラスを作成する方が簡単なことがよくあります。または、Usurperを使用してスタブを自動的に生成することもできます。
インターフェイスには、java.lang.reflect.Proxy の機能を使用できます。MessageConstants クラスの回答をスタブ化すると仮定すると、コードは次のようになります。
InvocationHandler handler = new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (String.class.equals(method.getReturnType()))
return "proxy generated method return";
throw new AbstractMethodError("Not implemented");
}
};
Class<?> proxyClass = Proxy.getProxyClass(MessageConstants.class.getClassLoader(), new Class[] { MessageConstants.class });
MessageConstants messageConstants = (MessageConstants) proxyClass.getConstructor(new Class[] {InvocationHandler.class}).newInstance(new Object[] { handler });
System.out.println(messageConstants.description());
messageConstants.getBoolean("someBoolean");
そして結果として
proxy generated method return
Exception in thread "main" java.lang.Error: Not implemented
at xxx.Application$1.invoke(Application.java:48)
at $Proxy0.getBoolean(Unknown Source)
at xxx.Application.main(Application.java:64)
InvocationHandler はスタブを駆動し、残りは単なる配管です。
EasyMockを使用する場合、実際に呼び出されて使用されると予想されるメソッドの動作/期待/スタブのみを指定する必要があります。
JMock と EasyMock の両方を使用した後、EasyMock の API は約 10 倍簡単に使用できると言わざるを得ません。インターフェイスはほとんどが静的に型付けされているため、リファクタリングも安全です (メソッド名に文字列を使用しているなど)。