Google Mock - 使用CoTaskMemFree时,测试返回时没有结果

时间:2017-01-27 13:52:25

标签: c++ unit-testing winapi googlemock

我在类中有一个使用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之后”。我确信这是我看不到的微不足道的事情,但我无法解决这个问题。 任何人都可以解释这种行为吗?

1 个答案:

答案 0 :(得分:1)

CoTaskMemFree用于释放分配有CoTaskMemAllocCoTaskMemRealloc的内存。如果不是这样,它将失败。

你的模拟产生的指针不符合这个条件。

PWSTR password = L"SuperSecretPwd";

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