我在类中有一个使用CoTaskMemFree清理内存的方法:
HRESULT A::doStuff() {
PWSTR protectedPassword = L"";
HRESULT hr = helper->ProtectMyPassword(L"Secret", &protectedPassword);
LOG("Before CoTaskMemFree");
CoTaskMemFree(protectedPassword);
LOG("After CoTaskMemFree");
return hr;
}
我想测试方法ProtectMyPassword被调用,所以我模拟了我的Helper类并编写了以下测试:
TEST(TestA, MyTest)
{
// arrange
NiceMock<HelperMock> helperMock;
A classUnderTest = A(&helperMock);
PWSTR password = L"SuperSecretPwd";
EXPECT_CALL(helperMock, ProtectMyPassword (_, _)).WillByDefault(DoAll(SetArgPointee<2>(password), Return(1)));
// act
HRESULT hr = classUnderTest.doStuff();
// assert
EXPECT_TRUE(SUCCEEDED(hr));
}
但是,如果我运行测试,它将显示“ RUN”(运行),但不显示“ OK”(确定),并且完成时没有任何错误。
[ RUN ] TestA.SomeOtherTest
[ OK ] TestA.SomeOtherTest (2 ms)
[ RUN ] TestA.MyTest
D:\Projects\PwdSafe\C++\x64\Release>
在我的日志中,我看到“ CoTaskMemFree之前”,但没有“ CoTaskMemFree之后”。我确定这是一件微不足道的事情,但我无法解决。
有人可以解释这种行为吗?
最佳答案
CoTaskMemFree
用于释放用CoTaskMemAlloc
或CoTaskMemRealloc
分配的内存。如果不是这种情况,它将失败。
您的模拟产生的指针不满足此条件。
PWSTR password = L"SuperSecretPwd";
因此,运行时错误。为了解决这个问题,您需要从COM堆中分配模拟对象。
关于c++ - Google Mock-使用CoTaskMemFree时测试返回无结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41895558/