我在类中有一个使用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用于释放用CoTaskMemAllocCoTaskMemRealloc分配的内存。如果不是这种情况,它将失败。

您的模拟产生的指针不满足此条件。

PWSTR password = L"SuperSecretPwd";


因此,运行时错误。为了解决这个问题,您需要从COM堆中分配模拟对象。

关于c++ - Google Mock-使用CoTaskMemFree时测试返回无结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41895558/

10-11 00:35