gmock: выполнение пользовательской проверки, которая может дать сбой
Я использую библиотеку Google Mock в своих модульных тестах и пытаюсь выполнить пользовательскую проверку, которая может дать сбой.
Следующий пример демонстрирует, что я пытаюсь сделать:
struct Base
{
};
struct Derived : Base
{
int a;
};
struct MockClass
{
MOCK_METHOD1( Send, void ( Base & ) );
};
Теперь я хотел бы проверить, был ли поддельный объект передан объекту типа Derived в методе Send и значению a. Итак, как это сделать?
Моя идея состоит в том, чтобы использовать Invoke и переадресовать вызов какой-либо функции, которая будет dynamic_cast из Base в Derived, и проверить значение. Если тип не ожидаемый, выведите исключение. Как это:
void TestCall( Base &obj )
{
Derived *realObj = dynamic_cast< Derived * >( &obj );
if ( NULL == realObj )
{
throw 123;
}
}
затем проверьте, как это:
MockClass mockObj;
EXPECT_CALL( mockObj, Send(_) )
.WillOnce( Invoke( &TestCall ) );
Это сработает? Или есть лучший способ?
1 ответ
Вы можете определить пользовательское сопоставление, чтобы проверить тип и значение вашего аргумента одновременно:
MATCHER_P(IsDerivedAnEqual, a, "") {
Derived* derived_arg = dynamic_cast<Derived*>(&arg);
return derived_arg != NULL && derived_arg->a == a;
}
EXPECT_CALL(mock_obj, Send(IsDerivedAndEqual(5));
Вы также можете использовать составные сопоставители для построения более сложных условий.
Звонки, которые вы кладете в WillOnce()
выражение действия. Они вызываются только в том случае, если вызов соответствует ожиданиям, которые вы установили, и должен имитировать действия внешней зависимости в случае вызова. Использование их для установки ожиданий не сработает.