2011-12-08 128 views
3

GoogleMockがテスト終了時に問題を誤って報告しています。私は間違って何をしていますか?私はgooglemockのドキュメントを精査しましたが、完全な例はなく、私が抱えている問題については何も記述していません。テストの終了時にGoogleモックが誤ってエラーを報告しています。私は間違って何をしていますか?

私が手にエラーがある:

googlemocktest.cpp(53): ERROR: this mock object should be deleted but never is. 
Its address is @0018FDC4. 
ERROR: 1 leaked mock object found at program exit. 

簡単なテストのためのコードは次のとおりです。私はIBAR ::〜IBAR()が実際に呼ばなっているデバッガを使用して検証した

#include <string> 
#include <iostream> 
#include <memory> 
#include "gmock/gmock.h" 

class IBar 
{ 
public: 
    virtual ~IBar() {} 
    virtual void b() = 0; 
    virtual int c(std::string) = 0; 
}; 

class Foo 
{ 
private: 
    IBar *bar_; 
public: 
    Foo(IBar *bar); 
    int a(); 
}; 

Foo::Foo(IBar *bar) 
    : bar_(bar) 
{ 
} 

int Foo::a() 
{ 
// bar_->b(); 
    return bar_->c("hello"); 
} 

class BarMock : public IBar 
{ 
public: 
    MOCK_METHOD0(b, void()); 
    MOCK_METHOD1(c, int(std::string)); 
}; 

using ::testing::Return; 

void TestAFunctionInFoo() 
{ 
    try 
    { 
     BarMock barMock; 
     std::unique_ptr<Foo> newFoo(new Foo(&barMock)); 

     EXPECT_CALL(barMock, b()); 
     EXPECT_CALL(barMock, c("hello")).WillOnce(Return(42)); 

     newFoo->a(); 
    } 
    catch (std::exception& e) 
    { 
     std::cout << "Mock exception caught: " << e.what() << std::endl; 
    } 
    catch (...) 
    { 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    ::testing::GTEST_FLAG(throw_on_failure) = true; 
    ::testing::InitGoogleMock(&argc, &argv[0]); 
    TestAFunctionInFoo(); 
    return 0; 
} 

。しかし、私はまだこのエラーメッセージが表示されます。 Foo :: a()でIBar :: b()の呼び出しをコメント解除すると、テストの失敗がなくなりcatchステートメントが呼び出されなくなります。 IBar ::〜IBar()が呼び出されましたが、モックオブジェクトが削除されていないことを示すエラーメッセージはありません。

ご協力いただきありがとうございます。あなたがthrow_on_failureフラグを有効にしているので、それが起こる

+0

私は恐れますが、gest 4.6.1でFedora 15のgtest/gmock 1.5で動作を確認しました。あなたはgmockリスト/グループを試しましたか? – boycy

答えて

4

- それはGoogle Mock ForDummiesに述べていますよう:

このアプローチはキャッチを持っている:それはGoogleのモックが時々モックオブジェクトのデストラクタから例外をスローします。

デストラクタから例外がスローされるため、モックオブジェクトは決して完全に削除されず、プログラム終了時にフレームワークは文句を言います。

この問題の最も簡単な解決策は、ユニットテストフレームワークとしてGoogle Testを使用し、throw_on_failureフラグを無効にすることです(デフォルト状態) - モックの期待値が満たされていないとGTestは自動的にテストに失敗します。

あなたは別の枠組み(例えばCppUnitの)を使用しているので、あなたがGoogleのテストを使用できない場合は、この方法であなたの試験体を書き換えることができます与えられたモック期待が満たされている場合

void TestAFunctionInFoo() 
{ 
    ::testing::GTEST_FLAG(throw_on_failure) = true; 
    BarMock barMock; 

    try 
    { 
     std::unique_ptr<Foo> newFoo(new Foo(&barMock)); 

     EXPECT_CALL(barMock, b()); 
     EXPECT_CALL(barMock, c("hello")).WillOnce(Return(42)); 

     newFoo->a(); 
     ::testing::Mock::VerifyAndClearExpectations(&barMock); 
    } 
    catch (std::exception& e) 
    { 
     // expectations failed - do whatever you want 
    } 

    ::testing::GTEST_FLAG(throw_on_failure) = false; 
} 

VerifyAndClearExpectations(void*)チェック - そうでない場合とthrow_on_failureフラグが有効な場合、例外がスローされます。

このようにして、モックオブジェクトが正しく破棄され、何かが間違っても例外が発生します。

BTW:catch (...) { }を使用しないでください。ほとんどの場合、コード品質が悪いことがわかります。

関連する問題