Google 模拟 - 使用 CoTaskMemFree 时测试 returns 没有结果
Google Mock - Test returns without result when using CoTaskMemFree
我在 class 中有一个使用 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-class 并编写了以下测试:
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>
在我的日志中,我看到了 "Before CoTaskMemFree" 但没有看到 "After CoTaskMemFree"。我确定这是我看不到的微不足道的事情,但我就是无法解决。
有人可以解释这种行为吗?
CoTaskMemFree
用于释放使用 CoTaskMemAlloc
或 CoTaskMemRealloc
分配的内存。如果不是这种情况,它将失败。
您的模拟生成了一个不满足此条件的指针。
PWSTR password = L"SuperSecretPwd";
因此出现运行时错误。为了解决这个问题,你需要你的模拟从 COM 堆中分配。
我在 class 中有一个使用 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-class 并编写了以下测试:
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>
在我的日志中,我看到了 "Before CoTaskMemFree" 但没有看到 "After CoTaskMemFree"。我确定这是我看不到的微不足道的事情,但我就是无法解决。 有人可以解释这种行为吗?
CoTaskMemFree
用于释放使用 CoTaskMemAlloc
或 CoTaskMemRealloc
分配的内存。如果不是这种情况,它将失败。
您的模拟生成了一个不满足此条件的指针。
PWSTR password = L"SuperSecretPwd";
因此出现运行时错误。为了解决这个问题,你需要你的模拟从 COM 堆中分配。