2つのステートメントの間には、微妙ですが重要な違いがあります。EXPECT_CALL
モックコールに期待値を設定します。書き込み
EXPECT_CALL(mock, methodX(_)).WillRepeatedly(do_action);
gMockに、任意の引数を使用して何度でも呼び出すことmethodX
ができ、呼び出されると、を実行するように指示します。一方で、mock
mock
do_action
ON_CALL(mock, methodX(_)).WillByDefault(do_action);
methodX
で呼び出されるたびにmock
、を実行する必要があることをgMockに通知しますdo_action
。この機能は、モックに多くの期待を書き込む必要があり、それらのほとんど/すべてが同じアクションを指定する必要があるシナリオで役立ちます-特にそれが複雑な場合。でそのアクションを指定してから、アクションを明示的に指定せずにsをON_CALL
書き込むことができます。EXPECT_CALL
例えば、
ON_CALL(mock, Sign(Eq(0), _))
.WillByDefault(DoAll(SetArgPointee<1>("argument is zero"), Return(0)));
ON_CALL(mock, Sign(Gt(0), _))
.WillByDefault(DoAll(SetArgPointee<1>("argument is positive"), Return(1)));
ON_CALL(mock, Sign(Lt(0), _))
.WillByDefault(DoAll(SetArgPointee<1>("argument is negative"), Return(-1)));
これで、多くのsを作成する必要がある場合、毎回動作を指定する必要EXPECT_CALL
はありません。mock
EXPECT_CALL(mock, Sign(-4, _));
EXPECT_CALL(mock, Sign(0, _));
EXPECT_CALL(mock, Sign(1, _)).Times(2);
EXPECT_CALL(mock, Sign(2, _));
EXPECT_CALL(mock, Sign(3, _));
EXPECT_CALL(mock, Sign(5, _));
別の例では、Signが戻ると仮定するint
と、次のように記述します。
ON_CALL(mock, Sign(Gt(0), _)).WillByDefault(Return(1));
EXPECT_CALL(mock, Sign(10, _));
で指定された呼び出しのデフォルトの動作を提供するため、呼び出しは1mock.Sign(10)
を返します。しかし、あなたが書くならON_CALL
EXPECT_CALL
EXPECT_CALL(mock, Sign(Gt(0), _).WillRepeatedly(Return(1));
EXPECT_CALL(mock, Sign(10, _));
の呼び出しはmock.Sign(10, p)
0を返します。これは2番目の期待値と照合されます。その期待は明示的なアクションを指定せず、gMockはそれに対するデフォルトのアクションを生成します。そのデフォルトのアクションは、戻りタイプのデフォルト値を返すことです。これは、の場合は0ですint
。この場合、最初の期待は完全に無視されます。