2011-03-11 16 views
1

我在我的单元测试中使用谷歌模拟库,我试图做一个自定义检查,可以失败。gmock:做自定义检查,可以失败

一个示例演示了什么,我试图做的:

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

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

现在我想检查假冒对象得以通过的发送方法派生类型的对象和值。 那么,该怎么做呢?

我的想法是使用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)); 

难道这是否可行呢?或者,还有更好的方法?

回答

6

可以定义一个custom matcher验证类型和参数的同时值:

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)); 

您还可以使用composite matchers构建更复杂的条件。

打入WillOnce()表达式的调用是动作。只有在调用符合你设定的​​期望值时才会调用它们,并且应该模仿调用时外部依赖项会执行的操作。使用它们来设置期望不起作用。