如何使用gmock来模拟这个类,将其实例作为其他类中的类成员

时间:2012-06-21 07:50:08

标签: unit-testing gmock

我是gmock的新用户。 我不知道如何使用gmock来模拟这个类,它的实例作为其他类中的类成员。 代码如下所示:

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

现在,我想使用gmock来模拟B,然后在A的UnitTest中使用mockB。 你能告诉我怎么做吗? 谢谢!

2 个答案:

答案 0 :(得分:2)

您可以将B类模拟为:

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

然后使用:

MockB mockb;

并假设您的A类的构造函数之一是:

A(B b_)b(b_){}

因此,您可以通过以下方式使模拟功能可用:

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

答案 1 :(得分:1)

您可以使用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类实例。这可以通过在Test Fixtures中设置mock方法(CreateB)来返回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);
 }