当我如下定义我的测试时,它可以工作。
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 是我创建的一个谷歌模拟类。
当我添加将指向我的存根的指针传递给包装类的代码时,我得到一个泄漏的内存错误:
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
来自 3rd 方抽象类(我无法控制)的子类,其中包含所有虚拟方法但没有虚拟析构函数。它还使用 Microsoft 特定的属性声明__declspec(novtable)
。
我认为问题可能在于缺少Google Mock FAQ中描述的虚拟析构函数。但是我相信如果这是第一个测试也应该失败的问题。
如何修复/解决此错误?