gTest googleFramework

0

Witam!
Uczę się gTestu i napotkałem na taki problem:

 class Calc
{
public:
    Calc();
    virtual int addition(int x, int y);
    virtual int multiply(int x, int y);
    virtual int divide(int x, int y);
};
 Calc::Calc()
{

}
int Calc::addition(int x, int y)
{
    return x + y;
}

int Calc::multiply(int x, int y)
{
    return x * y;
}

int Calc::divide(int x, int y)
{
    return x / y;
}
 class MockSimpleCalc : public Calc
{
public:
    MOCK_METHOD2(addition, int(int x, int y));
    MOCK_METHOD2(divide, int(int x, int y));
    MOCK_METHOD2(multiply, int(int x, int y));
};
 TEST(TestSuiteCalc,test1)
{
    Calc realCalc;
    EXPECT_EQ(6, realCalc.addition(2,4));
}

TEST(TestSuiteCalc,test2)
{
    MockSimpleCalc mockCalc;
    EXPECT_EQ(6, mockCalc.addition(2,4));
}

Test numer 2 się wywala, zwraca 0 zamiast 6. Co pominąłem ?

0

Odpowiem sam sobie, ale moja odpowiedź rodzi kolejne pytanie ;-)
Trzeba poprawić klasę MockSimpleCalc

class MockSimpleCalc : public Calc
{
public:

    MockSimpleCalc()
    {
        ON_CALL(*this, addition(_,_)).WillByDefault(Invoke(&real_, &Calc::addition));
    }

    MOCK_METHOD2(addition, int(int x, int y));
    MOCK_METHOD2(divide, int(int x, int y));
    MOCK_METHOD2(multiply, int(int x, int y));
private:
    Calc real_;
}; 

Czy zawsze potrzebuje obiekt tej rzeczywistej klasy ? Tutaj stworzyłem sobie pole Calc real_ , można by tego nie robić ?

0

Tak tylko na boku mówiąc:

  1. Jesteś pewny, że twój kalkulator potrzebuje vtable?
  2. Jesteś pewny, że potrzebujesz mocka?
  3. Jesteś pewny, że potrzebujesz mocka, który woła prawdziwą klasę?
  4. Pamiętaj o const correctness, nie ma tego u Ciebie a to tylko najważniejszy ficzer C++sa.

Mocków używaj, kiedy prawdziwy obiekt wymagałby skomplikowanej konfiguracji i wykonywałby swoją robotę długo (czytałby coś z dysku / zaciągałby coś z neta / liczyłby coś ciężkiego) i co najważniejsze >byłby tylko zależnością<.

Skoro testujesz swoją klasę to testuj swoją klasę, a nie mocka robiącego pod spodem zbędną magię.

  1. Catch framework masterrace https://github.com/philsquared/Catch
0

Hej,
Ten Calc jest tylko i wyłącznie na potrzeby nauki.. Nie skupiałem się dokładnie na tym co tam jest. Normalnie użyłbym template'ów.
Interesuje mnie punkt 3 o którym wspomniałeś. Jestem pewny, że potrzebuje mocka, który nie woła prawdziwej klasy, jednak.. Nie wiem jak rozwiązać ten problem.
Jak miałby wyglądać konstruktor

     MockSimpleCalc()
    {
        ON_CALL(*this, addition(_,_)).WillByDefault(Invoke(&real_, &Calc::addition));
    }

Kiedy nie będziemy mieli obiektu real_

1 użytkowników online, w tym zalogowanych: 0, gości: 1