2

テストを次のように定義すると、機能します。

TEST(MyService, WhenCalled_DoesTheRightThingTM) {

    // Arrange
    ThirdPartyClassFake stub;

    EXPECT_CALL(stub, GetFirstName())
        .WillRepeatedly(Return("Bob"));

    // Act
    std::string result = stub.GetFirstName();

    // Assert
    EXPECT_STREQ("Bob", result);
}

ThirdPartyClassFakeは、私が作成したgoogleモッククラスです。

スタブへのポインタをラッパークラスに渡すコードを追加すると、リークされたメモリエラーが発生します。

TEST(MyService, WhenCalled_DoesTheRightThingTM) {

    // Arrange
    ThirdPartyClassFake stub;

    EXPECT_CALL(stub, GetFirstName())
        .WillRepeatedly(Return("Bob"));

    // Act
    MyWrapperClass wrapper(&stub);
    std::string result = stub.GetFirstName();

    // Assert
    EXPECT_STREQ("Bob", result);
}

エラーは次のとおりです。

1>  [ RUN      ] MyService.WhenCalled_DoesTheRightThingTM
1>unknown file : error : SEH exception with code 0xc0000005 thrown in the test body.
1>  [  FAILED  ] MyService.WhenCalled_DoesTheRightThingTM (1 ms)

1>c:\myfile.cpp(17): error : this mock object (used in test
MyService.WhenCalled_DoesTheRightThingTM) should be deleted but never is.
Its address is @0028E40C.
1>EXEC : error : 1 leaked mock object found at program exit.
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(113,5):
error MSB3073: The command "C:\MyProject.Tests.exe
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(113,5):
error MSB3073: :VCEnd" exited with code 1.

関連性があるかどうかはわかりませんがThirdPartyClassFake、サードパーティの抽象クラス(私は制御できません)のサブクラスを、すべての仮想メソッドを使用して追加する必要がありますが、仮想デストラクタは追加しません。また、Microsoft固有の属性で宣言されています__declspec(novtable)

Google Mock FAQで説明されているように、問題は仮想デストラクタの欠如にあるのではないかと思いました。しかし、それが問題だったとしたら、最初のテストも失敗するはずです。

このエラーを修正/回避するにはどうすればよいですか?

4

2 に答える 2

3

0xc0000005は、メモリからのアクセス違反です。適切なスイッチを使用してコードをコンパイルしなかった場合、このSEH例外がスローされ、デストラクタが適切に呼び出されなかった可能性があります。

于 2011-06-30T22:13:17.400 に答える
0

エラーは、コンストラクターに渡されたオブジェクトMyWrapperClassのグローバル/静的関数(サードパーティ)を呼び出すデストラクタにトレースされたと思います。Destroy私が渡すオブジェクトは偽物でDestroyあるため、何らかの理由で失敗する可能性があります。だから問題は、これをどのように回避するかです。この場合、MyWrapperClassはテスト対象のオブジェクトなので、変更したり、モックアウトしたりしたくありません。関数をモックする方法を見つけなければならないと思いますDestroy。方法がわかれば報告します。

于 2011-06-30T22:45:19.913 に答える