谷歌模拟:在程序退出时发现泄露的模拟对象?

时间:2011-06-30 22:06:49

标签: c++ memory-leaks mocking googletest googlemock

当我按如下方式定义测试时,它可以工作。

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中描述的虚拟析构函数。但是我相信如果这是问题,第一次测试也应该失败。

如何修复/解决此错误?

2 个答案:

答案 0 :(得分:3)

0xc0000005是来自内存的访问冲突。如果您没有使用正确的开关编译代码,那么可能会抛出此SEH异常并且未正确调用析构函数。

答案 1 :(得分:0)

我想我已经将错误跟踪到了MyWrapperClass的析构函数,它在传递给构造函数的对象上调用了一个全局/静态函数Destroy(第三方)。由于我传入的对象是假的,因此可能导致Destroy因某种原因而失败。所以问题是我该如何解决这个问题?在这种情况下,MyWrapperClass是被测试的对象,所以我不想修改它或模拟它。我想我必须找到一种模拟函数Destroy的方法。如果我知道如何会报告。