2017-01-27 2 views
0

を使用した場合のテストは、私はCoTaskMemFreeを使用してメモリをクリーンアップするクラスのメソッド持って結果なしで返します。Googleのモック - 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が呼び出されることをテストしたいので、私は私のヘルパーを嘲笑次のテストを-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> 

は、私が "CoTaskMemFree前に" ではなく "CoTaskMemFree後" を参照してください。私はそれが私が見ていない些細なものだと確信していますが、私はそれを解決できません。 誰でもこの現象を説明できますか?

答えて

1

CoTaskMemFreeは、CoTaskMemAllocまたはCoTaskMemReallocで割り当てられたメモリを解放するために使用されます。そうでない場合は失敗します。

あなたのモックがこの条件に合致しないポインタを生成しています。

PWSTR password = L"SuperSecretPwd"; 

したがって、ランタイムエラーです。これを修正するには、COMヒープから割り振るモックが必要です。

+0

実際、静的な文字列を渡しています: 'PWSTR password = L" SuperSecretPwd ";'。 'EXPECT_CALL()'マクロは、そのポインタにoutパラメータを設定して1を返す関数呼び出しを合成しているようです。 – andlabs

関連する問題