2017-01-27 1 views
0

У меня есть метод в классе, который очищает память, используя CoTaskMemFree:Google Mock - Тест возвращается без результата при использовании 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

CoTaskMemFree предназначенный для бесплатной памяти, выделенный как CoTaskMemAlloc или CoTaskMemRealloc. Это не сработает, если это не так.

Ваш макет дает указатель, который не соответствует этому условию.

PWSTR password = L"SuperSecretPwd"; 

Следовательно, ошибка времени выполнения. Чтобы исправить это, вам понадобится ваш макет для выделения из кучи COM.

+0

Действительно, они передают статическую строку: 'PWSTR password = L" SuperSecretPwd ";'. Макрос 'EXPECT_CALL()', кажется, синтезирует вызов функции, который просто устанавливает параметр out этому указателю и возвращает 1. – andlabs