。 EXPECT_CALL
はモックコールの期待値を設定します。
EXPECT_CALL(mock, methodX(_)).WillRepeatedly(do_action);
を書くことmethodX
は、任意の引数を使って、任意の回数mock
に呼び出すことができ、それがあるとき、mock
はdo_action
を実行することをgMockを伝えます。一方、
ON_CALL(mock, methodX(_)).WillByDefault(do_action);
はmethodX
がmock
で呼び出されたときに、それはdo_action
を実行する必要があることをgMockを伝えます。この機能は、モックに多くの期待を書かなければならないシナリオに役立ち、ほとんどの人/すべてが同じアクションを指定する必要があります。特に複雑な場合は特にそうです。そのアクションをON_CALL
に指定し、そのアクションを明示的に指定することなくEXPECT_CALL
を書き込むことができます。例えば。別の例では
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, _));
を、ログインリターンを想定して:あなたは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)));
さて、あなたはmock
年代に行動を毎回指定する必要はありません。 int
、あなたが
ON_CALL(mock, Sign(Gt(0), _)).WillByDefault(Return(1));
EXPECT_CALL(mock, Sign(10, _));
を書く場合ON_CALL
は、デフォルトの動作を提供してコールmock.Sign(10)
は1を返します。 EXPECT_CALL
で指定されたコール。しかし、あなたは
EXPECT_CALL(mock, Sign(Gt(0), _).WillRepeatedly(Return(1));
EXPECT_CALL(mock, Sign(10, _));
を書く場合mock.Sign(10, p)
の呼び出しは、それが第二の期待と照合されます0を返します。その期待は明示的なアクションを指定せず、gMockはデフォルトアクションを生成します。このデフォルトのアクションは戻り値の型のデフォルト値を返します.int
の場合は0になります。この場合、最初の期待は完全に無視されます。
しかし、ON_CALLを使用してEXPECT_CALLで定義済みのデフォルトアクションをオーバーライドしようとすると、動作しないようです。何か案が? – Nicoretti
@ニコレッティいいえ、動作しません。私はあなたが両方を設定するとどうなるかわからない。たぶんその場合、1つだけが実行されます。ところで、gtestには[section](http://code.google.com/p/googlemock/wiki/CheatSheet#Setting_Default_Actions)のデフォルト動作を設定する方法があります。 –
これを見ましたが、EXPECT_CALLを使用してデフォルトの動作を変更できるため、私は不思議で混乱しました。そして、ドキュメントは副作用/優先度について何も言わない...それらの両方を使用するとき。 – Nicoretti