我在单元测试中使用谷歌模拟库,我正在尝试进行可能失败的自定义检查。
下一个示例演示了我要做的事情:
struct Base
{
};
struct Derived : Base
{
int a;
};
struct MockClass
{
MOCK_METHOD1( Send, void ( Base & ) );
};
现在我想检查假对象是否在Send方法中传递了Derived类型的对象,以及值a。 那么,怎么做呢?
我的想法是使用Invoke并将调用转发给某个函数,该函数将从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 ) );
这会起作用吗?或者有更好的方法吗?
答案 0 :(得分: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()
表达式中的调用是操作。它们仅在调用符合您设置的期望时调用,并且应该模仿外部依赖项在调用时将执行的操作。用它们来设定期望是行不通的。