谷歌模拟 - 至少有多个期望之一

时间:2015-08-27 12:33:13

标签: c++ unit-testing googlemock

我正在使用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吗?

1 个答案:

答案 0 :(得分:1)

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

  1. 使用自定义方法执行者 - 使用相同的方法创建一个类。然后使用Invoke()将调用传递给该对象
  2. 使用偏序调用 - 按照here
  3. 所述,在不同的序列中创建不同的期望

    使用自定义方法执行程序

    这样的事情:

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