EasyMockでandReturn(T value)
とandStubReturn(T value)
を使用することの違いは何ですか?
どのような状況でandStubReturn()
を使用しますか?andReturn()
は同じ結果を達成できませんか?
モックのメソッド呼び出しにスタブリターンを使用しますが、発生することを期待しますが、それ以外の場合は関心がありません。「通常の」メソッドコールには通常のリターンを使用します。
次の方法を検討してください。
public void someMethod(String arg) {
if (logger.isDebugEnabled()) {
logger.debug("Calling doSomething() on service "
+ service.getName().hashCode());
}
service.postMessage("{" + arg + "}");
if (logger.isDebugEnabled()) {
logger.info("Finished calling doSomething() on service "
+ service.getName().hashCode());
}
}
...ここでservice
はモック可能なフィールドです。ログステートメントのhashCode()
のことは不自然ですが、要点は、NPEを回避するためにgetName()
の呼び出しに何回でも応答する必要があることです。それについて。
このメソッドのEasyMockベースの単体テストを作成する場合、andStubReturn()
への呼び出しをgetName()
にし、andReturn()
への呼び出しに通常のpostMessage(String)
を使用します。モックオブジェクトを検証するとき、後者のみを考慮し、log4j configを変更してもテストは中断しません。
明確にするための追加のメモ。
.andStubReturn()を使用する場合(または.andReturn(foo).anyTimes()を使用する場合)、予想される最小の呼び出しカウントはありません。したがって、これら2つのいずれかを使用してモックの期待値を設定し、モックされたメソッドが呼び出されない場合、.verify()呼び出しはアサートしません。
[〜#〜] not [〜#〜]モックされたメソッドが呼び出されないときにアサートする例;
FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andStubReturn(true);
EasyMock.replay(myFooClass);
EasyMock.verify(myFooClass);
モックされたメソッドが呼び出されないときに[〜#〜] will [〜#〜]アサートする例;
FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andReturn(true).atLeastOnce();
EasyMock.replay(myFooClass);
EasyMock.verify(myFooClass);