56

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

同じ結果が得られないandStubReturn()場合、どのような状況で使用しますか?andReturn()

4

2 に答える 2

58

発生することが予想されるが、他の方法では関心がないモックのメソッド呼び出しにはスタブリターンを使用します。「通常の」メソッド呼び出しには通常のリターンを使用します。

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

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()内容は工夫されていますが、重要なのはgetName()、NPEを回避するために、モックは任意の数の呼び出しに応答する必要があるということです。

このメソッドのEasyMockベースの単体テストを作成するときはandStubReturn()、を呼び出し、への呼び出しにgetName()通常を使用します。モックオブジェクトを検証するときは、後者のみが考慮され、log4j構成を変更してもテストは中断されません。andReturn()postMessage(String)

于 2010-09-20T21:21:41.670 に答える
6

明確にするための追加の注記。

.andStubReturn()を使用する場合(または.andReturn(foo).anyTimes()を使用する場合)、予想される最小呼び出し数はありません。したがって、これら2つのいずれかを使用してモック期待値を設定し、モックされたメソッドが呼び出されない場合、.verify()呼び出しはアサートされません。

モックされたメソッドが呼び出されない場合にアサートされない例。

FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andStubReturn(true);
EasyMock.replay(myFooClass);

EasyMock.verify(myFooClass);

モックされたメソッドが呼び出されないときにアサートする

FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andReturn(true).atLeastOnce();
EasyMock.replay(myFooClass);

EasyMock.verify(myFooClass);
于 2015-03-13T20:07:58.480 に答える