2012-06-21 55 views

回答

2

你可以嘲笑B類爲

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

然後用 MockB mockb; 並假設你的A級建設FUNC之一是

A(B b_)b(b_){} 

這樣你就可以通過

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

您可以使用工廠方法(這是由工廠模式不同)使模擬功能可行。

對於你的情況下面是一個例子代碼:

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); 
} 
相關問題