GoogleTest之设置期望


两种方式可与设置期望:ON_CALL和EXPECT_CALL。ON_CALL只定义当一个mock函数被调用时执行什么动作,不会定义任何期望;EXPECT_CALL 不止定义行为,而且定义mock以何种期望的形式被调用(包括被调用的顺序,次数等)。

  1. 调用的mock函数执行指定的动作:重写DefaultValue<T>::Set或者使用ON_CALL
  2. 如果不期望mock函数被调用,可与使用EXPECT_CALL(…).Times(0);如果只期望某些调用某些不调用如只希望参数=5和>5的情况下调用,可如下使用:
  EXPECT_CALL(foo, Bar(5));
  EXPECT_CALL(foo, Bar(Gt(10))).Times(AnyNumber());
  1. 如果对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));
  }

期望部分顺序调用

  1. EXPECT_CALL的After从句可以执行按部分顺序调用。
  2. 通过使用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 最多只能被调用一次
  • 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函数后执行的动作。这个调用有且只有一次。

猜你喜欢

转载自blog.csdn.net/u010378559/article/details/129737819
今日推荐