我有一个基类和两个派生类,就像这样:
class Base { ... };
class DerivedA : public Base { ... };
class DerivedB : public Base { ... };
我也有一个我正在模拟的接口类(使用Google Mock),如下所示:
class MockSomeInterface : public SomeInterface
{
public:
MOCK_METHOD1(someMethod, void(Base* basePtr));
};
我可以期望像这样对模拟方法的调用,根本不验证调用中的参数:
EXPECT_CALL(mockSomeInterfaceObj, someMethod(_))
Times(2);
[我想做的是验证提供给someMethod
的参数的类型,以检查它实际上是用DerivedA*
调用一次,还是用DerivedB*
调用,而不是用任何参数调用两次。
您可以为此编写匹配器函数。您的期望将如下所示
{
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。
gMock提供了一个指针匹配器,可用于将基类指针与派生类对象参数进行匹配。 (https://github.com/google/googletest/blob/master/googlemock/docs/cheat_sheet.md#pointer-matchers)
using ::testing::NotNull;
using ::testing::WhenDynamicCastTo;
EXPECT_CALL(mockSomeInterfaceObj, someMethod(WhenDynamicCastTo<DerivedA*>(NotNull()))).Times(1);
EXPECT_CALL(mockSomeInterfaceObj, someMethod(WhenDynamicCastTo<DerivedB*>(NotNull()))).Times(1);