两种方式可与设置期望:ON_CALL和EXPECT_CALL。ON_CALL只定义当一个mock函数被调用时执行什么动作,不会定义任何期望;EXPECT_CALL 不止定义行为,而且定义mock以何种期望的形式被调用(包括被调用的顺序,次数等)。
- 调用的mock函数执行指定的动作:重写
DefaultValue<T>::Set
或者使用ON_CALL
- 如果不期望mock函数被调用,可与使用EXPECT_CALL(…).Times(0);如果只期望某些调用某些不调用如只希望参数=5和>5的情况下调用,可如下使用:
EXPECT_CALL(foo, Bar(5));
EXPECT_CALL(foo, Bar(Gt(10))).Times(AnyNumber());
- 如果对mock函数的参数不感兴趣,可以忽略参数(只有当函数不是重载函数时有效)
不感兴趣(Uninteresting)和不期望(Unexpected)的调用的理解
Uninteresting:没有设置EXPECT_CALL(x, Y(…)),但是在测试程序中却调用了x.Y(…)
unexpected:设置了EXPECT_CALL(x, Y(…)),但是却没有调用x.Y(…)
unexpected的调用会报error,但是Uninteresting不是错误,只是一个警告。
nice mock会阻止uninteresting调用生成一个警告,strict mock会将警告转成一个error。
nice mock和strict mock的内容参考这里
按期望顺序调用
如果希望按顺序调用,在EXPECT_CALL 前声明一个InSequence。
using ::testing::_;
using ::testing::InSequence;
{
InSequence s;
EXPECT_CALL(foo, DoThis(5));
EXPECT_CALL(bar, DoThat(_))
.Times(2);
EXPECT_CALL(foo, DoThis(6));
}
期望部分顺序调用
- EXPECT_CALL的After从句可以执行按部分顺序调用。
- 通过使用InSequence()从句
using ::testing::Sequence;
...
Sequence s1, s2;
EXPECT_CALL(foo, A()).InSequence(s1, s2);
EXPECT_CALL(bar, B()).InSequence(s1);
EXPECT_CALL(bar, C()).InSequence(s2);
EXPECT_CALL(foo, D()).InSequence(s2);
按如下图的方式 (where s1 is A -> B, and s2 is A -> C -> D):
+---> B
|
A—|
|
±–> C —> D
控制期望的激活状态
- 当一个期望被调用后,它就变成非激活状态 TODO
EXPECT_CALL
EXPECT_CALL(mock_object,method_name(matchers...))
创建一个mock对象mock_object,这个对象有一个名为method_name的方法,方法的参数为matchers…。
EXPECT_CALL必须在任何mock对象之前使用。
以下方法的调用,必须按以下顺序进行:
EXPECT_CALL(mock_object, method_name(matchers...))
.With(multi_argument_matcher) // Can be used at most once
.Times(cardinality) // Can be used at most once
.InSequence(sequences...) // Can be used any number of times
.After(expectations...) // Can be used any number of times
.WillOnce(action) // Can be used any number of times
.WillRepeatedly(action) // Can be used at most once
.RetiresOnSaturation(); // Can be used at most once
详细说明:
- With(multi_argument_matcher)
- Times(cardinality):mock函数期望被调用的次数
- cardinality参数为以下值:
- AnyNumber():任意次
- AtLeast(n):至少n次
- AtMost(n):至多n次
- Between(m, n):m到n次之间
- Exactly(n) or n:n次,如果n为0则不被调用
- 如果Times没有调用,GoogleTest的处理规则如下:
- WillOnce和WillRepeatedly都没有指定,默认调用Times(1)
- 如果有n次WillOnce()但没有WillRepeatedly(),n>=1,cardinality为Times(n)
- 如果有n次WillOnce()和一次WillRepeatedly(),n>=0,cardinality为AtLeast(n)
- Times 最多只能被调用一次
- cardinality参数为以下值:
- InSequence:指定mock函数按给定顺序执行
- .After(expectations…):
- .WillOnce(action
- .WillRepeatedly(action):指定mock函数的实际行为。在WillOnce之后生效。
- .RetiresOnSaturation()
ON_CALL
签名:ON_CALL(mock_object,method_name(matchers...))
定义了调用mock_object对象的method_name方法后执行的动作。如果matchers被忽略了,类似于每个参数都是"_",即可以匹配任意值。
ON_CALL(mock_object, method_name(matchers...))
.With(multi_argument_matcher) // Can be used at most once
.WillByDefault(action); // Required
- .With(multi_argument_matcher):将参数作为整体匹配。GoogleTest将所有参数作为一个tuple给matcher,multi_argument_matcher最终将是Matcher<std::tuple<A1, …, An>>。这个调用最多一次
- .WillByDefault(action):指定调用mock函数后执行的动作。这个调用有且只有一次。