[解決済み] gmockのデフォルトアクションの設定 / ON_CALLとEXPECT_CALLの比較
質問
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
. この場合、最初の期待値は完全に無視されます。
関連
-
[解決済み] テスト
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】'cout'は型名ではない
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】Enterキーを押して続行する
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません