64

ON_CALL と EXPECT_CALL を使用してデフォルト アクションを指定する場合の違いがわかりません。

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

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

また

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

誰かが私に説明できますか:

  • 2つの方法の違い
  • それぞれの浮き沈み
  • それらをいつ使用するのが適切ですか(どのようなセットアップ...)
4

5 に答える 5

69

2つのステートメントの間には、微妙ですが重要な違いがあります。EXPECT_CALLモックコールに期待値を設定します。書き込み

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

gMockに、任意の引数を使用して何度でも呼び出すことmethodXができ、呼び出されると、を実行するように指示します。一方で、mockmockdo_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_CALLEXPECT_CALL

EXPECT_CALL(mock, Sign(Gt(0), _).WillRepeatedly(Return(1));
EXPECT_CALL(mock, Sign(10, _));

の呼び出しはmock.Sign(10, p)0を返します。これは2番目の期待値と照合されます。その期待は明示的なアクションを指定せず、gMockはそれに対するデフォルトのアクションを生成します。そのデフォルトのアクションは、戻りタイプのデフォルト値を返すことです。これは、の場合は0ですint。この場合、最初の期待は完全に無視されます。

于 2012-12-19T17:40:35.717 に答える
13
ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01));
EXPECT_CALL(mock, methodX(_)).WillRepeatedly(Return(0x01));

あなたが言ったように、これらの 2 つの行はまったく同じことを行っているため、違いはまったくありません。いずれかの方法を使用して、デフォルトのアクションを自由に設定してください。

ただし、論理的な違いがあります。

  • ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01));メソッドが呼び出される可能性があることを意味し、その場合、すべての呼び出しは 0x01 を返します。
  • EXPECT_CALL(mock, methodX(_)).WillRepeatedly(Return(0x01));メソッドが呼び出されることが予想され、すべての呼び出しが 0x01 を返すことを意味します

ところで、彼らのチート シートにはデフォルト アクションの設定があり、次のように書かれています。

特定のメソッドのデフォルト アクションをカスタマイズするには、ON_CALL() を使用します。

ON_CALL(mock_object, method(matchers))
    .With(multi_argument_matcher)  ?
    .WillByDefault(action);
于 2012-12-18T13:23:04.213 に答える