Google Mock: при выходе из программы обнаружен протекший макет? - PullRequest
2 голосов
/ 01 июля 2011

Когда я определяю свой тест следующим образом, он работает.

TEST(MyService, WhenCalled_DoesTheRightThingTM) {

    // Arrange
    ThirdPartyClassFake stub;

    EXPECT_CALL(stub, GetFirstName())
        .WillRepeatedly(Return("Bob"));

    // Act
    std::string result = stub.GetFirstName();

    // Assert
    EXPECT_STREQ("Bob", result);
}

ThirdPartyClassFake - это созданный мною класс Google.

Когда я добавляю код, который передает указатель на мою заглушку в класс-оболочку, я получаю ошибку утечки памяти:

TEST(MyService, WhenCalled_DoesTheRightThingTM) {

    // Arrange
    ThirdPartyClassFake stub;

    EXPECT_CALL(stub, GetFirstName())
        .WillRepeatedly(Return("Bob"));

    // Act
    MyWrapperClass wrapper(&stub);
    std::string result = stub.GetFirstName();

    // Assert
    EXPECT_STREQ("Bob", result);
}

Ошибка:

1>  [ RUN      ] MyService.WhenCalled_DoesTheRightThingTM
1>unknown file : error : SEH exception with code 0xc0000005 thrown in the test body.
1>  [  FAILED  ] MyService.WhenCalled_DoesTheRightThingTM (1 ms)

1>c:\myfile.cpp(17): error : this mock object (used in test
MyService.WhenCalled_DoesTheRightThingTM) should be deleted but never is.
Its address is @0028E40C.
1>EXEC : error : 1 leaked mock object found at program exit.
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(113,5):
error MSB3073: The command "C:\MyProject.Tests.exe
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(113,5):
error MSB3073: :VCEnd" exited with code 1.

Не уверен, что это уместно, но я должен добавить, что подклассы ThirdPartyClassFake из стороннего абстрактного класса (который я не контролирую) со всеми виртуальными методами, но без виртуального деструктора. Также он объявляется с атрибутом Microsoft __declspec(novtable).

Я подумал, что проблема может заключаться в отсутствии виртуального деструктора, как описано в Google Mock FAQ . Однако я полагаю, что если бы это было проблемой, то первое испытание тоже не прошло бы.

Как исправить / обойти эту ошибку?

Ответы [ 2 ]

3 голосов
/ 01 июля 2011

0xc0000005 - нарушение прав доступа из памяти.Вероятно, это исключение SEH было сгенерировано, и деструктор не был вызван должным образом, если вы не скомпилировали код с правильными переключателями.

0 голосов
/ 01 июля 2011

Я думаю, что отследил ошибку до деструктора MyWrapperClass, который вызывает глобальную / статическую функцию Destroy (третье лицо) для объекта, переданного в конструктор. Поскольку объект, который я передаю, является поддельным, он, вероятно, приводит к сбою Destroy по той или иной причине. Итак, вопрос в том, как мне обойти это? В этом случае MyWrapperClass является тестируемым объектом, поэтому я не хочу изменять его или макетировать. Я думаю, мне нужно найти способ издеваться над функцией Destroy. Отзовусь, если узнаю как.

...