1. ホーム
  2. c++

[解決済み] gmockのデフォルトアクションの設定 / ON_CALLとEXPECT_CALLの比較

2022-02-11 23:25:52

質問

ON_CALLとEXPECT_CALLの使い分けがわかりません。 デフォルトのアクションを指定します。

これまで、モックのデフォルトアクションを調整する方法は2つあることに気づきました/学びました。

ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01));

または

EXPECT_CALL(mock, methodX(_)).WillRepeatedly(Return(0x01));

どなたか説明してください。

  • 2つの方法の違い
  • それぞれの長所と短所
  • どのような場合に使用するのが適切か(どのような設定か ...)

解決方法は?

この2つの文には、微妙な、しかし大きな違いがあります。 EXPECT_CALL はモックコールに期待値を設定します。書き方

EXPECT_CALL(mock, methodX(_)).WillRepeatedly(do_action);

はgMockに methodX を呼び出すことができます。 mock は、任意の引数で何度でも、そして、それがあるときは mock を実行します。 do_action . 一方

ON_CALL(mock, methodX(_)).WillByDefault(do_action);

はgMockに次のように伝えます。 methodX が呼び出されると mock を実行する必要があります。 do_action . この機能は、モックにたくさんの期待値を書いて、そのほとんど/すべてが同じアクションを指定しなければならないようなシナリオで役に立ちます -- 特にそれが複雑な場合です。そのアクションは 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)));

さて、もしあなたがたくさんの 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, _));

呼び出し mock.Sign(10) は1を返すので 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はこの期待値に対してデフォルトのアクションを生成します。このデフォルトのアクションは、戻り値の型のデフォルト値を返すというものです。 int . この場合、最初の期待値は完全に無視されます。