web-dev-qa-db-ja.com

EasyMock andReturn()vs andStubReturn()

EasyMockでandReturn(T value)andStubReturn(T value)を使用することの違いは何ですか?

どのような状況でandStubReturn()を使用しますか?andReturn()は同じ結果を達成できませんか?

54
Glide

モックのメソッド呼び出しにスタブリターンを使用しますが、発生することを期待しますが、それ以外の場合は関心がありません。「通常の」メソッドコールには通常のリターンを使用します。

次の方法を検討してください。

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を変更してもテストは中断しません。

56
Barend

明確にするための追加のメモ。

.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);
5
Ben