3

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

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

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

4

2 回答 2

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(...)
于 2012-09-23T16:01:00.330 回答
1

您可以使用工厂方法(这与工厂模式不同)。

对于您的情况,这是一个示例代码:

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)。

模拟方法应该返回一个 MockB 类实例。这可以通过在测试夹具中设置模拟方法(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);
 }
于 2015-09-03T08:45:25.720 回答