2015-10-30 35 views
1

我有一個基類和兩個派生類,像這樣的參數的:如何驗證派生類型傳遞給嘲笑函數

class Base { ... }; 
class DerivedA : public Base { ... }; 
class DerivedB : public Base { ... }; 

我也有我嘲笑一個接口類(具有谷歌模擬),像這樣:

class MockSomeInterface : public SomeInterface 
{ 
    public: 
    MOCK_METHOD1(someMethod, void(Base* basePtr)); 
}; 

我可以期待這樣的嘲笑方法調用,而不是驗證呼叫參數都:

EXPECT_CALL(mockSomeInterfaceObj, someMethod(_)) 
    Times(2); 

我想要做的是驗證給出的參數的類型someMethod,以檢查它實際上是否使用DerivedA*一次和DerivedB*來調用一次,而不是使用任何參數兩次。

回答

1

你可以寫此匹配功能。然後,您的期望會像這樣

{ 
    InSequence s; 
    EXPECT_CALL(mockSomeInterfaceObj, someMethod(IsDerivedA())) 
    Times(1); 
    EXPECT_CALL(mockSomeInterfaceObj, someMethod(IsDerivedB())) 
    Times(1); 
} 

如果您已經定義了以下匹配功能:

MATCHER(IsDerivedA, "") 
{ 
    if (arg == NULL) 
    { 
    return false; 
    } 
    DerivedA* derived = dynamic_cast<DerivedA*>(arg); 
    if (derived == NULL) 
    { 
    *result_listener << "is NOT a DerivedA*"; 
    return false; 
    } 
    return true; 
} 

MATCHER(IsDerivedB, "") 
{ 
    if (arg == NULL) 
    { 
    return false; 
    } 
    DerivedB* derived = dynamic_cast<DerivedB*>(arg); 
    if (derived == NULL) 
    { 
    *result_listener << "is NOT a DerivedB*"; 
    return false; 
    } 
    return true; 
} 

注意的是,如果它不是一個指針參數,但參考,dynamic_cast將拋出std::bad_cast,而不是返回NULL,在類型的情況下不匹配(http://en.cppreference.com/w/cpp/language/dynamic_cast)。