Google Mock - как смоделировать объект, принадлежащий тестируемому классу - PullRequest
0 голосов
/ 23 октября 2019

В этом примере

class A
{
public:
    A();
    ~A();

    virtual void func1();
    virtual void func2();

protected:
    virtual void func3();
private:
    // How do I mock this
    NetworkClass b;
}

Как мне смоделировать NetworkClass b объект?

Я не думаю, что это возможно сделать исключительно с помощью макросов google-mock. Вам придется переопределить идентификатор NetworkClass, чтобы фактически означать NetworkClassMock, а затем (для целей теста) переименовать оригинал NetworkClass во что-то еще, например NetworkClass_Orig.

Но это все еще нене помог вам получить доступ к приватному члену NetworkClass b для целей теста.

1 Ответ

1 голос
/ 24 октября 2019

Нельзя издеваться b как есть. Вам нужно будет использовать Внедрение зависимостей .

Сначала вам нужно будет указать базовый класс (или интерфейс) и получить NetworkClass и NetworkClassMock из INetworkClass. Затем вы можете передать необработанный указатель (лучше умный указатель, такой как std :: unique_ptr ) или ссылку на class A. Этим вводом может быть либо ваша реальная реализация NetworkClass, либо ваша имитация NetworkClassMock.

См. Этот пример:

#include <iostream>

class INetworkClass
{
public:
    virtual void doSomething() = 0;
};

class NetworkClass : public INetworkClass
{
public:
    void doSomething() override {std::cout << "Real class" << std::endl;} ;
};

class NetworkClassMock : public INetworkClass
{
public: 
    void doSomething() override {std::cout << "Mock class" << std::endl;};
};

class A
{
public:
    A(INetworkClass& b) : b(b) {};
    ~A() {};

    void func1() {b.doSomething();};

private:
    // How do I mock this
    INetworkClass& b;
};

int main(){
  NetworkClass real_class;
  NetworkClassMock mock_class;

  A a1(real_class);
  A a2(mock_class);

  a1.func1();
  a2.func1();

  return 0;
}

Если вы просто хотите получить доступ к личному члену, например, для чтенияЭто значение после выполнения некоторых тестов, вы должны изменить свой код. Доступ к закрытым членам за пределами вашего класса не является хорошим дизайном. Если вы все еще хотите сделать это, вы можете проверить этот ответ (написанный для C # вместо C ++, но все еще пригодный для использования).

PS Чтобы использовать ключевое слово override, вам нужно будет скомпилировать с C ++11 поддержка.

...