Как издеваться над возвращаемым объектом - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь смоделировать класс User и его вложенную структуру UserBuilder:

class User
{
  public:
        virtual int loadData(const std::string& filename);
        virtual UserBuilder getUserBuilder(const std::string& functionName) const;

        struct UserBuilder
       {
        UserBuilder(std::string functionName) : m_functionName{functionName} {};
        virtual ~UserBuilder();
        virtual UserBuilder& fun1();
        virtual UserBuilder& fun2(int32_t num);
        virtual bool callFunction();
       private:
        std::string m_functionName{};
      };
}

Это макет класса для пользователя:

class UserMock : public User
{
public:
    MOCK_METHOD1(loadData, int(const std::string& filename));
    MOCK_CONST_METHOD1(getUserBuilder, UserBuilder(const std::string& functionName));
};

Это класс макета для UserBuilder:

struct UserBuilderMock : public User::UserBuilder
{
public:
    UserBuilderMock(std::string functionName) : User::UserBuilder(functionName) {}
    MOCK_METHOD0(fun1, UserBuilder&());
    MOCK_METHOD1(fun2, UserBuilder&(int32_t num));
    MOCK_METHOD0(callFunction, bool());
};

Я хочу проверить эту функцию:

void useCase(std::unique_ptr<User> userP)
{   
    int status = userP->loadFile("init");
    if (status == 0)
    {
        User::UserBuilder builder = userP->getUserlBuilder("init");
        bool result = builder.fun1().fun2(1).callFunction();
        return result;
    }
    else
    {
        return false;
    }
}

Я даю getUserBuilder ("init") фиктивный объект builderMock в качестве возвращаемого значения, например:

auto userMock = std::make_unique<UserMock>();
ON_CALL(*userMock, loadFile("init")).WillByDefault(Return(0));
UserBuilderMock builderMock("init");
EXPECT_CALL(*userMock, getUserBuilder("init")).WillOnce(ReturnPointee(&builderMock));
EXPECT_CALL(builderMock,fun1()).Times(1);

Журнал теста не пройден: fun1 никогда не вызывал - неудовлетворен и активен. Я хочу использовать объект builderMock для вызова ложного метода fun1, fun2 и callFunction, но он по-прежнему использует реальный объект UserBuilder, вызывающий реальные fun1, fun2 и callFunction. Что мне нужно сделать, чтобы объект Mock вызывал метод Mock?

1 Ответ

0 голосов
/ 30 января 2020

Вы должны переписать свой код, чтобы User :: getUserBuilder возвращал указатель (возможно, умный) на UserBuilder.

С помощью метода, возвращающего объект UserBuilder

EXPECT_CALL(*userMock, getUserBuilder("init")).WillOnce(ReturnPointee(&builderMock));

getUserBuilder приводит макет к объекту своего базового класса (срезы), теряя все фиктивные дополнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...