Использование Google Mock с указателем на интерфейс - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть следующий интерфейс:

struct IBackgroundModel {
    virtual Image process(const Image& inputImage) = 0;
    virtual ~IBackgroundModel() = default;
};

и тест с макетом:

TEST_F(EnvFixture, INCOMPLETE) {
        struct BackgroundModelMock : IBackgroundModel {
            MOCK_METHOD1(process, Image(const Image& override));
        };
        std::unique_ptr<IBackgroundModel> model = std::make_unique<BackgroundModelMock>();
        Image input;
        Image output;
        EXPECT_CALL(model, process(input)).Will(Return(output));


        BackgroundModelFactory factory;
        factory.set(model.get());
        const auto result = factory.process(input);
    }

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

error C2039: 'gmock_process': is not a member of 'std::unique_ptr<P,std::default_delete<P>>'
        with
        [
            P=kv::backgroundmodel::IBackgroundModel
        ]
C:\Source\Kiwi\Kiwi.CoreBasedAnalysis\Libraries\Core\Kiwi.Vision.Core.Native\include\Ptr.hpp(17): message : see declaration of 'std::unique_ptr<P,std::default_delete<P>>'
        with
        [
            P=kv::backgroundmodel::IBackgroundModel
        ]

1 Ответ

1 голос
/ 14 апреля 2020

Во-первых, EXPECT_CALL принимает ссылку, а не (умный) указатель. Во-вторых, это должна быть ссылка на конкретный макет, а не на симулируемый класс / интерфейс. И в-третьих, в последнем gtest нет функции Will. Есть WillOnce и WillRepeadately. Таким образом, исправление выглядит так:

std::unique_ptr<BackgroundModelMock> model = std::make_unique<BackgroundModelMock>();
Image input;
Image output;
EXPECT_CALL(*model, process(input)).WillOnce(testing::Return(output));

...