gmock: выполнение пользовательской проверки, которая может дать сбой - PullRequest
1 голос
/ 11 марта 2011

Я использую библиотеку 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 Ответ

6 голосов
/ 21 марта 2011

Вы можете определить настраиваемое сопоставление для одновременной проверки типа и значения вашего аргумента:

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(), являются action . Они вызываются только в том случае, если вызов соответствует ожиданиям, которые вы установили, и должен имитировать действия внешней зависимости в случае вызова. Использование их для установки ожиданий не сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...