我是gmock的新用户。 我不知道如何使用gmock来模拟这个类,它的实例作为其他类中的类成员。 代码如下所示:
classs B
{
B_fun();
};
class A
{
B b;
A_fun()
{
if( b.B_fun() === XXX )
{
doXXXXX...
}
}
现在,我想使用gmock来模拟B,然后在A的UnitTest中使用mockB。 你能告诉我怎么做吗? 谢谢!
答案 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);
}