1

我在我的单元测试中使用谷歌模拟库,并且我正在尝试进行可能失败的自定义检查。

下一个示例演示了我正在尝试做的事情:

struct Base
{
};
struct Derived : Base
{
  int a;
};

struct MockClass
{
  MOCK_METHOD1( Send, void ( Base & ) );
};

现在我想检查假对象是否在 Send 方法中传递了 Derived 类型的对象,以及值 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 ) );

这行得通吗?或者,还有更好的方法?

4

1 回答 1

6

您可以定义一个自定义匹配器来同时验证参数的类型和值:

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()表达式中的调用是actions。仅当调用与您设置的期望匹配时才会调用它们,并且应该模仿外部依赖项在调用时会执行的操作。用它们来设定期望是行不通的。

于 2011-03-21T20:56:10.217 回答