【问题标题】:Google mock - at least one of multiple expectations谷歌模拟 - 多个期望中的至少一个
【发布时间】:2015-11-21 20:18:18
【问题描述】:

我正在使用 Google Mock 为外部 API 指定兼容层。在外部 API 中,有多种方法可以执行某些操作,因此我想指定一组期望中的至少一个(或者最好是恰好一个)期望得到满足。在伪代码中,这就是我想要做的:

Expectation e1 = EXPECT_CALL(API, doFoo(...));
Expectation e2 = EXPECT_CALL(API, doFooAndBar(...));
EXPECT_ONE_OF(e1, e2);
wrapper.foo(...);

使用 Google Mock 可以做到这一点吗?

【问题讨论】:

  • EXPECT_CALL(API, doFoo(_)).Times(1); 有效吗?
  • @BЈовић 只要wrapper.foo()调用doFoo()就可以,但我想测试通过即使wrapper.foo()不调用doFoo(),只要它调用@987654327而是@。

标签: c++ unit-testing googlemock


【解决方案1】:

这可以通过两种方式实现:

  1. 带有自定义方法的执行器——创建一个类,具有相同的方法。然后使用Invoke() 将调用传递给该对象
  2. 使用偏序调用 - 以不同的顺序创建不同的期望,如here 所述

带自定义方法执行器

类似这样的:

struct MethodsTracker {
   void doFoo( int ) {
     ++ n;
   }
   void doFooAndBar( int, int ) {
     ++ n;
   }
   int n;
};

TEST_F( MyTest, CheckItInvokesAtLeastOne ) {
  MethodsTracker tracker;
  Api obj( mock );

  EXPECT_CALL( mock, doFoo(_) ).Times( AnyNumber() ).WillByDefault( Invoke( &tracker, &MethodsTracker::doFoo ) );
  EXPECT_CALL( mock, doFooAndBar(_,_) ).Times( AnyNumber() ).WillByDefault( Invoke( &tracker, &MethodsTracker::doFooAndBar ) );

  obj.executeCall();

  // at least one
  EXPECT_GE( tracker.n, 1 );
}

使用偏序调用

TEST_F( MyTest, CheckItInvokesAtLeastOne ) {
      MethodsTracker tracker;
      Api obj( mock );

      Sequence s1, s2, s3, s4;

      EXPECT_CALL(mock, doFoo(_)).InSequence(s1).Times(AtLeast(1));
      EXPECT_CALL(mock, doFooAndBar(_,_)).InSequence(s1).Times(AtLeast(0));

      EXPECT_CALL(mock, doFoo(_)).InSequence(s2).Times(AtLeast(0));
      EXPECT_CALL(mock, doFooAndBar(_,_)).InSequence(s2).Times(AtLeast(1));

      EXPECT_CALL(mock, doFooAndBar(_,_)).InSequence(s3).Times(AtLeast(0));
      EXPECT_CALL(mock, doFoo(_)).InSequence(s3).Times(AtLeast(1));

      EXPECT_CALL(mock, doFooAndBar(_,_)).InSequence(s4).Times(AtLeast(1));
      EXPECT_CALL(mock, doFoo(_)).InSequence(s4).Times(AtLeast(0));

      obj.executeCall();
}

【讨论】:

  • 部分订单调用看起来很快就会失控,但使用自定义方法执行器似乎是一个合适的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
相关资源
最近更新 更多