Почему в моем коде не вызывается метод g-mocked

Я пытаюсь реализовать фиктивный метод и убедиться, что он вызывается только так. Ниже приведен простой пример, в котором я пытаюсь смоделировать метод класса A:ShowPubA2. Следовательно, у меня есть следующий код:

class A {
public:
    virtual void ShowPubA1()
    {
        std::cout << "A::PUBLIC::SHOW..1" << std::endl;
    }
    virtual int ShowPubA2(int x)
    {
        std::cout << "A::PUBLIC::SHOW..2 " << x << std::endl;
        return x;
    }
};

class MockA : public A {
public:
    MOCK_METHOD0(ShowPubA1, void());
    MOCK_METHOD1(ShowPubA2, int(int x));
};

Теперь я объявляю еще один класс B, наследующий от A -

class B : public A
{
public:
    int ShowPubB2(int x)
    {
        ShowPubA2(x);
        std::cout << "B::PUBLIC::SHOW..2 " << x << std::endl;
        return x;
    }
};

Ниже приведены подробности моего тестового случая:

TEST(FirstB, TestCall) {
    using ::testing::_;
    MockA a;
    EXPECT_CALL(a, ShowPubA2(_)).Times(AtLeast(1));
    B b;
    EXPECT_EQ(2, b.ShowPubB2(2));
}

Из вывода мы видим, что вызывается фактическая реализация, а не фиктивные методы, поэтому тест не проходит:

[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from Firstb
[ RUN      ] Firstb.TestCall
A::PUBLIC::SHOW..2 2
B::PUBLIC::SHOW..2 2
c:\myuser\documents\c and c++\gmock\consoleapplication1\consoleapplicati
n1\consoleapplication1.cpp(69): error: Actual function call count doesn't match
EXPECT_CALL(a, ShowPubA2(_))...
         Expected: to be called at least once
           Actual: never called - unsatisfied and active
[  FAILED  ] Firstb.TestCall (0 ms)
[----------] 1 test from Firstb (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (0 ms total)
[  PASSED  ] 0 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] Firstb.TestCall

 1 FAILED TEST
Press any key to continue . . .

Пожалуйста, дайте мне знать, как я могу издеваться над методом и вызывать его вместо фактического.


person Programmer    schedule 31.07.2017    source источник


Ответы (1)


Вы должны изменить B, чтобы ввести A на что-то вроде:

class B
{
public:
    explicit B(A& a) : a(&a) {}

    int ShowPubB2(int x)
    {
        a->ShowPubA2(x);
        std::cout << "B::PUBLIC::SHOW..2 " << x << std::endl;
        return x;
    }
private:
    A* a;
};

а потом

TEST(FirstB, TestCall) {
    using ::testing::_;
    MockA a;
    EXPECT_CALL(a, ShowPubA2(_)).Times(AtLeast(1));
    B b(a);
    EXPECT_EQ(2, b.ShowPubB2(2));
}
person Jarod42    schedule 31.07.2017
comment
Спасибо за подробности и пример кода, но в реальном сценарии я бы не смог изменить классы. - person Programmer; 31.07.2017
comment
Есть и другие способы внедрить A в класс, например template. если вы не можете изменить B и A, вы не сможете использовать свой MockA. - person Jarod42; 31.07.2017