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

Google Mock - Test returns without result when using CoTaskMemFree

本文关键字:返回 测试 结果 Mock 使用 CoTaskMemFree Google      更新时间:2023-10-16

我在类中有一个使用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 的方法,所以我模拟了我的帮助程序类并编写了以下测试:

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      ] TestA.SomeOtherTest
[       OK ] TestA.SomeOtherTest (2 ms)
[ RUN      ] TestA.MyTest
D:ProjectsPwdSafeC++x64Release>

在我的日志中,我看到"在CoTaskMemFree之前",但没有看到"在CoTaskMemFree之后"。我敢肯定这是我看不到的微不足道的事情,但我就是无法解决它。谁能解释这种行为?

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

您的模拟正在生成一个不满足此条件的指针。

PWSTR password = L"SuperSecretPwd";

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