您可以使用工廠方法(這是由工廠模式不同)使模擬功能可行。
對於你的情況下面是一個例子代碼:
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);
}