2012-06-21 3 views
2

Я новый пользователь с gmock. Я не знаю, как использовать gmock, чтобы издеваться над этим классом, что его экземпляр как член класса в другом классе. Коды выглядит, как показано ниже:Как использовать gmock для издевательства этого класса, чтобы его экземпляр как член класса в другом классе

classs B 
{ 
    B_fun(); 
}; 
class A 
{ 
    B b; 
    A_fun() 
    { 
    if(b.B_fun() === XXX) 
    { 
    doXXXXX... 
    } 
} 

Теперь я хочу использовать gmock издеваться B, а затем использовать mockB в UnitTest в. Не могли бы вы рассказать мне, как это сделать. Спасибо!

ответ

2

вы можете издеваться класса B, как

class MockB: pubic class B 
{ 
    MockMethod0(B_func, void()) 
}; 

затем использовать MockB mockb; И предположим, что один из строительного FUNC вашего класса А

A(B b_)b(b_){} 

так что вы можете сделать макет функцию работоспособной по

A test_a = A(mockb); 
EXPECT_CALL(...) 
0

Вы можете использовать метод Factory (это отличается от фабричной модели) ,

В вашем случае здесь пример кода:

class B 
{ 
    B_fun(); 
}; 

class A 
{ 

    A() 
    { 
     b = CreateB(); 
    } 

    A_fun() 
    { 
     if(b->B_fun() === XXX) 
     { 
      doXXXXX... 
     } 
    } 

    private: 

    virtual B* CreateB() 
    { 
     return new B(); 
    } 

    B* b; 
} 

Так вот у вас есть метод CreateB который является виртуальным.

Теперь создайте класс MockA и высмеивайте только этот метод (CreateB).

Метод mock должен возвращать экземпляр класса MockB. Это можно сделать, установив метод макета (CreateB) в Test Fxtures для возврата экземпляров MockB.

теперь ставит ожидания на экземпляр MockB, как вы хотите.

В практична:

class MockA : public A 
{ 
public: 
    virtual ~MockA() {} 
    MOCK_METHOD1(CreateB, B*()); 
}; 

TEST_F(TestA, TestSomething) 
{ 
    MockB* b(new MockB()); // mock that will be used 
    MockA a;    // class under test, factory method(s) mocked 
    // setup mocks 
    EXPECT_CALL(a, CreateB()).Times(Exactly(1)).WillOnce(Return(b)); 

    EXPECT_CALL(*b, SomeMethod()).Times(Exactly(1)); 

    // execute test 
    a.A_fun(3u); 
}