2012-12-18 178 views
30

にデフォルトアクションを指定すると、ON_CALLとEXPECT_CALLの違いを理解できません。gmockデフォルトアクションの設定/ ON_CALL対EXPECT_CALL

これまでのところ、私は気づい/モックのデフォルトの動作を調整するには、2つの方法があります学んだ:

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

または

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

は、誰かが私に説明してもらえ:

  • 2つの方法の違い
  • 浮き沈みあなたが言ったように、これらの2行はまったく同じことをやっている(セットアップの種類...)

答えて

29

EXPECT_CALLはモックコールの期待値を設定します。

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

を書くことmethodXは、任意の引数を使って、任意の回数mockに呼び出すことができ、それがあるとき、mockdo_actionを実行することをgMockを伝えます。一方、

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

methodXmockで呼び出されたときに、それは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になります。この場合、最初の期待は完全に無視されます。

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

それらを使用することが適切である場合には、したがって、差がない各1

  • のまったく。いずれかの方法で、デフォルトアクションを設定してください。

    しかし、論理的な違いがある:

    • ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01));は、メソッドが呼び出されるかもしれないことを意味し、それが発生した場合、すべての呼び出しは、0x01の
    • EXPECT_CALL(mock, methodX(_)).WillRepeatedly(Return(0x01));を返しますが、それは方法がすることが期待されていることを意味呼ばれること、およびすべてのコールがちなみに0x01の

    を返し、そのCHでSetting default actionsあり言いシート、食べる:

    は、特定のメソッドのデフォルトの動作をカスタマイズするには、ON_CALL()を使用して2つの文の間に微妙ではあるが有意な違いがあります

    ON_CALL(mock_object, method(matchers)) 
        .With(multi_argument_matcher) ? 
        .WillByDefault(action); 
    
  • +0

    しかし、ON_CALLを使用してEXPECT_CALLで定義済みのデフォルトアクションをオーバーライドしようとすると、動作しないようです。何か案が? – Nicoretti

    +2

    @ニコレッティいいえ、動作しません。私はあなたが両方を設定するとどうなるかわからない。たぶんその場合、1つだけが実行されます。ところで、gtestには[section](http://code.google.com/p/googlemock/wiki/CheatSheet#Setting_Default_Actions)のデフォルト動作を設定する方法があります。 –

    +0

    これを見ましたが、EXPECT_CALLを使用してデフォルトの動作を変更できるため、私は不思議で混乱しました。そして、ドキュメントは副作用/優先度について何も言わない...それらの両方を使用するとき。 – Nicoretti

    関連する問題