2017-10-12 61 views
3

私はgmockが新しく、SaveArgを使用するときに何が起こるかを理解したいと思います。ここでC++ gmock - SaveArgにnullポインタを渡すと何が起こるか

は、私がgmockのドキュメンタリーで見つけたものです:

SaveArg<N>(pointer):*ポインタに引数(0ベース)N番目を保存します。 「ポインタ」で指さ何にN番目の引数の値を割り当てるN番目の引数、または

    1. メイク「ポインタ」のポイント:

      は、この平均値を行います?

    私は次のような状況を考えています:私のテスト機能で、その後

    class MockClass : public BaseClass { public: MOCK_METHOD1(somefunc,void(SomeType&)); };

    SomeType val; //make this live throughout the test 
    SomeType* pval = nullptr; 
    
    MockClass mymock; 
    EXPECT_CALL(mymock, somefunc(_)).WillOnce(SaveArg<0>(pval)); 
    
    //let's force a call 
    mymock.somefunc(val); 
    
    EXPECT_NE(nullptr, pval); 
    

    私のポイントは次のとおりです。

    場合(1)が真であれば、何が起こるのでしょうか:pval = &val - >テストが進行します。

    (2)が真の場合、何が起こるのですか:*pval = val - >これは、pvalがヌルポインタのセグメンテーション違反を引き起こします。

    私はSaveArgにnullptrを渡し、セグメンテーションフォールトを取得しない上記の状況に似ていますが、テストにもパスされません。

    あなたが私を助けることができたら本当に感謝します。

    おかげ

  • 答えて

    1

    質問:

    SaveArg(ポインタ):N番目の保存(0ベース)引数*ポインタへ。 N番目の引数に

    メイク「ポインタ」の点、または「ポインタ」で指さ何に N番目の引数の値を割り当てる:

    は、この平均していますか?

    編集(VladLosevによる修正)これは基本的にポインタで指されたもののN番目の引数の2番目のコピー値です。

    だから、あなたの観察された行動について:私は SaveArgにnullptrを渡すと、セグメンテーションフォールトを得ることはありません上記1に同じような状況がありますが、テストはどちらか が渡されていません

    これは、EXPECT_NEの実装の詳細が原因です。ここで問題にgoogletest FAQからの短い抜粋です:

    が原因C++のいくつかの特殊性のために、それは EXPECT_XX()とASSERT_XXの引数としてNULL使用してサポートするために、いくつかの非自明なテンプレート メタプログラミングのトリックが必要です()マクロ。したがって、私たちはそれが最も必要なのは です(それ以外の場合は、Googleテストの実装を維持するのが難しく、必要以上にエラーが発生しやすくなります)。

    簡単な答えでは、googletestでnullと比較すると、ASSERT_EQまたはEXPECT_EQまたは* _TRUEのバリエーションを使用する必要があります。詳細については、FAQの項目のリンクを参照してください。

    +1

    SaveArgは(2)です。 [実装コード](https://github.com/google/googletest/blob/48ee8e98abc950abd8541e15550b18f8f6cfb3a9/googlemock/include/gmock/gmock-more-actions.h#L172)は、そのことを非常に明確にしています。 – VladLosev

    +0

    私は別のテストコードを書いて、(2)が実際の動作であることを確認できます。 @ iheanyi VladLosevを手伝ってくれてありがとう。 –

    関連する問題